当我在Django中创建另一个对象时,是否可以创建对象?
我有这样的代码,我想先创建AnotherModel实例,然后再创建Model实例(在创建AnotherModel时)。
@receiver(pre_save, sender=AnotherModel)
def save_model(sender, **kwargs):
# some code
我尝试使用Django信号-pre_save。
{{1}}
但是我有这样的例外:
ValueError:无法分配“ u'Test”:“ AnotherModel.resource”必须是“ Model”实例。
答案 0 :(得分:0)
在Django中创建另一个对象时,是否可以创建对象?
是的,您有两个选择吗?
1)选项1 :覆盖保存(Overriding predefined model methods)
from django.db import models
class AnotherModel(models.Model):
model = models.ForeignKey(Model, on_delete=models.CASCADE)
description = models.TextField()
def save(self, *args, **kwargs):
if self.pk is None: # create
self.model = Model.objects.create( name = "some random name" )
super().save(*args, **kwargs) # Call the "real" save() method.
2)选项2 :Using pre-save signal:
from django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save, sender=AnotherModel)
def my_handler(sender, **kwargs):
if sender.pk is None: # create
sender.model = Model.objects.create( name = "some random name" )
重要:
必须先创建相关模型才能保存当前模型。在我使用的示例中:
Model.objects.create( name = "some random name" )
但是您可以按常规方式创建模型:
m = Model()
m.name = "random name"
m.save() # <--- important!
答案 1 :(得分:0)
是的,可以在创建另一个对象时创建一个对象。我认为使用信号可能是最好的方法。
from django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save, sender=AnotherModel)
def my_handler(sender, **kwargs):
if sender.pk is None:
sender.model = Model.objects.create(name="Name")
您只需要创建AnotherModel
的实例,以便发出已实现的信号:
>>> o = AnotherModel.objects.create(description='This is a silly description')
您可以检查是否已创建Model
实例并将其分配给o.model
:
>>> o.model