繁体   English   中英

在Django中创建另一个对象时创建对象

[英]Create object when created another object in Django

在Django中创建另一个对象时可以创建对象吗?

我有这样的代码,我想先创建AnotherModel实例,然后再创建Model实例(在创建AnotherModel时)。

class Model(models.Model):
    name = models.CharFiled(max_length=50)

class AnotherModel(models.Model):
    model = models.ForeignKey(Model, on_delete=models.CASCADE)
    description = models.TextField()

我尝试使用Django信号-pre_save。

@receiver(pre_save, sender=AnotherModel)
def save_model(sender, **kwargs):
    # some code

但是我有这样的例外:

ValueError:无法分配“ u'Test”:“ AnotherModel.resource”必须是“ Model”实例。

在Django中创建另一个对象时可以创建对象吗?

是的,您可以,您是否有两种选择:

1) 选项1 :覆盖保存( 覆盖预定义的模型方法

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使用预保存信号

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!

是的,可以在创建另一个对象时创建一个对象。 我认为使用信号可能是最好的方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM