django - 初始化模型字段,包括manytomanyfields
Posted
技术标签:
【中文标题】django - 初始化模型字段,包括manytomanyfields【英文标题】:django - initialize model fields including manytomanyfields 【发布时间】:2012-03-10 11:24:21 【问题描述】:全部,
我有一套相关模型:
class Foo(models.Model):
fooName = models.CharField()
bars = models.ManyToManyField("Bar")
class Bar(models.Model):
barName = models.CharField()
当我创建一个新的时,我希望它有一组默认数据。对于普通字段,这很容易做到。但我不确定如何处理关系字段。假设我希望每个 foo 都用名称“I am a foo”和一组三个 bar 进行初始化,每个 bar 都有特定的名称(例如,“I am bar one”、“I am bar 2”和“I am a foo”。上午三号吧。”)。
def Initialize(self)
self.fooName = "I am a foo"
self.bars = ?!?
我只是不知道该怎么做。有什么建议吗?
【问题讨论】:
【参考方案1】:您不能在没有主键的模型实例上使用多对多关系。
-
保存模型,以启用 m2m 关系
保存您的其他模型,以便在另一侧也启用 m2m 关系
使用 .add(),例如 yourmodel.bars.add(othermodel)
如果你想设置默认的初始数据,你应该use fixtures。
【讨论】:
【参考方案2】:您可以使用 django 的 signals 来执行此操作。每次创建 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()
【讨论】:
以上是关于django - 初始化模型字段,包括manytomanyfields的主要内容,如果未能解决你的问题,请参考以下文章