Создать объект при создании другого объекта в Django - PullRequest
1 голос
/ 11 июля 2019

Можно ли создать объект, когда я создал другой объект в 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".

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Да, можно создать объект при создании другого.Я думаю, что использование сигнала, возможно, лучший способ сделать это.

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
0 голосов
/ 11 июля 2019

Можно ли создать объект , когда я создал другой объект в 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!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...