【问题标题】:Cross-Saving possible?交叉储蓄可能吗?
【发布时间】:2021-03-08 11:43:25
【问题描述】:

我的 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")
[...]

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

【问题讨论】:

  • 是的,您应该能够通过查询 db 中与 Account 对象中的外键值匹配的 Person 对象,然后使用您的任何值更新该 Person 对象来更新链接到该帐户的人员想要。

标签: python django model save


【解决方案1】:

当然,您可以使用下面的代码执行此操作。但是,据我所知,没有功能可以做到这一点。 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")
[...]

或者,如果您希望每次保存模型时都执行此逻辑,您可以使用覆盖 Account 类的 save 方法。 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 

另外,我不推荐它,但您可以使用保存后信号。注意,调试信号很困难。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()

【讨论】:

  • 多么棒的解决方案和解释!非常感谢!
  • 如果我可能会问:这是否也可以在没有任何外键连接的模型中使用完整的新条目?
  • 如果模型之间没有连接,也没有捷径可走,但你总是可以使用ORM进行类似的操作。
猜你喜欢
  • 2012-12-02
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多