django - инициализировать поля модели, включая многие поля - PullRequest
2 голосов
/ 20 февраля 2012

All

У меня есть набор связанных моделей:

 class Foo(models.Model):
   fooName = models.CharField()
   bars = models.ManyToManyField("Bar")

 class Bar(models.Model):
   barName = models.CharField()

Когда я создаю новый, я бы хотел, чтобы у него был набор данных по умолчанию. Это довольно легко сделать для обычных полей. Но я не уверен, что делать для полей отношений. Давайте представим, что я хочу, чтобы каждый foo был инициализирован с именем «Я являюсь foo» и набором из трех баров, каждый с определенными именами (скажем, «Я бар один», «Я бар два» и «Я Я бар три. ").

 def Initialize(self)
   self.fooName = "I am a foo"
   self.bars = ?!?

Я просто не знаю, как это сделать. Есть предложения?

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

Вы можете сделать это, используя сигналы django .Каждый раз, когда создается экземпляр вашей Foo модели, также создайте другую необходимую вам информацию:

class Foo(models.Model):
    ...

from django.db.models.signals import post_save 
from signals import create_initial_data
post_save.connect(create_initial_data, sender=Foo)

и в файле с именем signals.py:

from models import Bar
def create_initial_data(sender, instance, created, raw):
    if created and sender == 'Foo':
        bar_1 = Bar(...)
        bar_2 = Bar(...)
        ...
        bar_1.save()
        bar_2.save()
        ...
        instance.bars.add(bar_1, bar_2, ...)
        instance.save()
3 голосов
/ 20 февраля 2012

Нельзя использовать отношение многие ко многим в экземпляре модели, у которого нет первичного ключа.

  1. Сохранить модель , чтобы включить отношения m2m
  2. Сохраните другую модель , чтобы включить отношения m2m и на другой стороне
  3. Используйте .add () , например yourmodel.bars.add(othermodel)

Если вы хотите установить исходные данные по умолчанию, вам следует использовать приборы .

...