【问题标题】:django - initialize model fields including manytomanyfieldsdjango - 初始化模型字段,包括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 = ?!?

我只是不知道该怎么做。有什么建议吗?

【问题讨论】:

    标签: django django-models model many-to-many django-orm


    【解决方案1】:

    您不能在没有主键的模型实例上使用多对多关系。

    1. 保存模型,以启用 m2m 关系
    2. 保存您的其他模型,以便在另一侧也启用 m2m 关系
    3. 使用 .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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-03
        • 2015-06-22
        • 2010-12-01
        • 2012-09-24
        • 1970-01-01
        • 2020-06-19
        • 2010-12-27
        • 2020-06-29
        相关资源
        最近更新 更多