可以交叉保存吗?
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()
我的 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()