簡體   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