可以交叉保存吗?

Cross-Saving possible?

我的 django 应用程序中的模型之间是否存在“交叉保存”的可能性?

例如:

models.py

class Person(models.Model):
    first_name = models.CharField()
    last_name = models.CharfFeld()
    age = models.IntegerField()
    value_person= models.IntegerField()
    date_created = models.DateField
    

class Account():
    name = models.CharField()
    description = models.Textarea()
    person = models.ForeignKey(Person, null=False, blank=False, on_delete=models.CASCADE)
    value_a = models.IntegerField()
    value_b = models.IntegerField()
    date_created = models.DateField 

forms.py:

class UpdateAccountForm(ModelForm):
    class Meta:
        model = Account
        exclude = [
            'name',
            'date_created',
        ]

views.py:

[...]
    account_db = Account.objects.get(id=pk)

    form = UpdateAccountForm(instance=Account)
    if request.method == 'POST':
        form = CreateAccountForm(request.POST, instance=Account)
        if form.is_valid():
            form.save()
            *** Do something here
            return("Somehwere")
[...]

现在我问自己,是否有可能 - 在更新“帐户”时 - 更新“人”,并且 - 例如 - 将两个“值_...”之一添加到“ value_person”?应该通过“ForeignKey”建立连接,对吗?我想我还应该提一下,我说的是我的默认数据库! 我知道这可能是一个不好的例子,但这只是为了让我能够理解这背后的系统 - 希望存在 - 功能!

当然,您可以使用下面的代码来完成此操作。但是,据我所知,没有执行此操作的功能。 foreign key relations

account_instance = Account.object.get(id=1)
person = account_instance.person
person.value_person += 1 
person.save()

例如,如果你只希望它在视图中,你可以按照下面的代码进行操作

[...]
account_db = Account.objects.get(id=pk)

form = UpdateAccountForm(instance=Account)
if request.method == 'POST':
    form = CreateAccountForm(request.POST, instance=Account)
    if form.is_valid():
        form.save()
        person = account_db.person
        person.value_person += 1 
        person.save()
        return("Somehwere")
[...]

或者如果您希望每次保存模型时都执行此逻辑,您可以覆盖帐户 class 的保存方法。 overriding model save

class Account():
    name = models.CharField()
    description = models.Textarea()
    person = models.ForeignKey(Person, null=False, blank=False, on_delete=models.CASCADE)
    value_a = models.IntegerField()
    value_b = models.IntegerField()
    date_created = models.DateField 

    def save(self, *args, **kwargs):
        self.person.value_person += 1 
        self.person.save()
        super().save(*args, **kwargs) # don't forget to call super method 

此外,我不推荐它,但您可以使用 post 保存信号。请注意,很难调试信号。django doc

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Account)
def increase_person_values(sender, instance, **kwargs):
    instance.person.value_person += 1
    instance.person.save()