Как увеличить счетчик на моей модели внешнего ключа - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть следующие сомнения: Давайте предположим, что мой проект Django имеет следующие модели:

class State(models.Model):
    initials = models.CharField('Initials', max_length=2, blank = False)
    name     = models.CharField('State', max_length=50, blank = False)
    count    = models.IntegerField('Foo Counter', default=0)
    ....


class Foo(models.Model):
   name  = models.CharField('Name', max_length=50, blank = False)
   state = models.ForeignKey(State, verbose_name='State', related_name='state_fk', on_delete=models.DO_NOTHING),
   .... 

Итак, у меня есть форма для добавления экземпляров Foo в мою базу данных:

class FooForm(forms.ModelForm):
   class Meta:
       model  = Foo
       fields = '__all__' 

это файл view.py:

def home(request):
    template_name = 'home.html'
    form = FooForm(request.POST or None)
    if form.is_valid():
        salvar = form.save(commit=False)
        salvar.save()
        return redirect('FooApp:home')
    else:
        context = {
            'form': form
        }
        return render(request, template_name, context)

Мне нужно, чтобы каждый раз, когда пользователь регистрировал новый 'Foo', счетчик выбранного им 'State' увеличивался на 1, я много раз ищу здесь и в документах Django, но не могу найти способ сделай это.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Зачем вам нужно count определить как поле модели, если оно зависит от вычислений в базе данных, а не от того, что будет вводиться извне?

Как уже упоминалось ранее, вы можете добавить логику в приложениеобновить значение count с State до self.foo_set.count()

Однако я думаю, что, возможно, стоит рассмотреть другой подход, который будет определять cached_property для State следующим образом:

@cached_property
def count(self):
    return self.foo_set.count()

Таким образом, вы сможете получить доступ к State.count в любом месте приложения и получить правильное значение, не беспокоясь о его обновлении.

0 голосов
/ 22 апреля 2019

Вам, возможно, не нужно отслеживать счет вручную таким образом. Для любого экземпляра состояния вы всегда можете позвонить:

state.foo_set.count()

Это всегда даст вам текущий счет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...