Предварительно заполнить записи в связанной таблице - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть три таблицы: ReflectionDate, ReflectionItem и ReflectionItemDateLink. Отношения между ними следующие: 1) каждая запись в ReflectionDate может быть связана с несколькими записями в ReflectionItem;2) соответствие между ReflectionDate и ReflectionItem сохраняется в ReflectionItemDateLink.

#models.py
class ReflectionDate(models.Model):
    date=models.DateField(default=datetime.now, blank=True)
    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.date)



class ReflectionItem(models.Model):

    reflection_item=models.CharField(max_length=200,null=True,blank=True)

    Yes = "Yes"
    No = "No"
    Include_or_not = (
        (Yes, "Yes"),
        (No, "No"),
    )
    include=models.CharField(max_length=9,
                  choices=Include_or_not,
                  default=Yes)

    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.reflection_item)


class ReflectionItemDateLink(models.Model):
    date=models.ForeignKey(ReflectionDate,on_delete=models.CASCADE)

    item=models.ForeignKey(ReflectionItem,on_delete=models.CASCADE)

    remark=models.CharField(max_length=200,null=True,blank=True)

    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)

В админке Django у меня есть

#admin.py
##about reflection items
class ReflectionItemAdmin(admin.ModelAdmin):
    pass

class ReflectionItemInlineFormSet(BaseInlineFormSet):
    model = ReflectionItemDateLink

    def __init__(self, *args, **kwargs):
        super(ReflectionItemInlineFormSet, self).__init__(*args, **kwargs)

        self.initial=[]

        ids=ReflectionItem.objects.filter(include='Yes').values_list('pk', flat=True)

        for item_i in ids:
            self.initial+=[{'item':ReflectionItem.objects.get(pk=item_i)}] 


class ReflectionItemInline(admin.TabularInline):
    model = ReflectionItemDateLink
    formset = ReflectionItemInlineFormSet
    print(ReflectionItem.objects.count())
    #extra = DeepHour.objects.count()
    extra = ReflectionItem.objects.filter(include='Yes').count()

class ReflectionDateAdmin(admin.ModelAdmin):
    inlines=[ReflectionItemInline]
    # pass

admin.site.register(ReflectionDate,ReflectionDateAdmin)
admin.site.register(ReflectionItem,ReflectionItemAdmin)

Моя цель: когда я создаю новую запись в ReflectionDate (используя ReflectionDateAdmin), я хочу, чтобы все записи ReflectionItem были с include = Yesбыть предварительно заполненным и автоматически показанным на странице ReflectionDateAdmin. Это было в основном реализовано с использованием ReflectionItemInline и ReflectionItemInlineFormSet. Примерно так (статический не отображается должным образом, но пока не проблема)

admin page

Однако я обнаружил, что если я добавлю новую запись вReflectionItem, новая запись не будет отображаться при создании новой записи в ReflectionDate. Я думаю, что проблема в том, что следующая строка

extra = ReflectionItem.objects.filter(include='Yes').count()

не будет обновлена ​​при добавлении записи в ReflectionItem (кажется, что ReflectionItemInline обновляется только при перезапуске сервера).

Мой вопрос: как я могу обновить эту «лишнюю» строку в ReflectionItemInline, когда новая запись создается в ReflectionItem? Или есть какая-нибудь другая реализация?

Надеюсь, я проясню. Большое спасибо!

...