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的主要内容,如果未能解决你的问题,请参考以下文章

Django 中的 OneToOne、ManyToMany 和 ForeignKey 字段有啥区别?

Django Admin -> 更改字段顺序,包括内联字段

Django--ORM 多表查询

在 django 模型中为 id 设置自动递增初始值

Django:扩展用户模型避免数据库连接

如何将计算字段添加到 Django 模型