【问题标题】:The right way to set the default value of a ManyToMany field in django在 django 中设置 ManyToMany 字段默认值的正确方法
【发布时间】:2020-12-01 21:27:07
【问题描述】:

设置 many2many 字段的默认值的正确方法是什么?这是我在下面尝试过的,但它不起作用。我知道我可以覆盖 save 方法,但不是每次更新模型时都会调用它吗?我只想在每次创建实例时设置模型的初始值。

def default_values():
     return [c.id for c in SomeOtherModel.objects.filter(otherfield__isnull = True)]


class SomeModel(models.Model):
    somefield = models.ManyToManyField('SomeField', default=default_values)
    semeotherfield = models.ForeignKey('SomeOtherField')

我正在使用 django 1.8

【问题讨论】:

    标签: python django many-to-many


    【解决方案1】:

    问题中提到的方法不起作用,因为ManyToManyField 在保存时不能有值(值必须与RelatedManager 一起添加)。所以ManyToManyFielddefault 选项在保存对象时不使用(当调用<object>.save() 或其他时):即使它已设置(例如,对于返回对象列表的可调用对象),该字段也将被设置保存时到一个空列表。

    根据this ticket

    default 选项值用于 Django 表单设置来编辑它 目的。特别是,在 Django Admin 中,多值下拉菜单将 include 字段,它将包含由返回的所有对象 可调用定义为默认值 - 它们都是 选择。如果用户在没有任何编辑的情况下保存对象(通过推送 表单的“保存”按钮),那么该字段确实会设置为全部 值。

    【讨论】:

      【解决方案2】:

      您可以覆盖保存方法,并在其中插入检查主键是否为空。如果它是空的 - 这是对象的创建。

      您还可以连接到 post save 信号 - 有一个属性告诉您这是否是对象的创建。

      【讨论】:

      • 好的,我会试试的。但是你知道为什么上面的方法不起作用吗?
      • 我现在收到此错误:“ [] 需要有字段 [] 的值才能使用这种多对多关系。”。我的保存方法在上面。
      • 成功了,谢谢,我只需要在填充字段之前保存模型。
      • @JiydaMoussa 我可以看看你是怎么做到的吗?
      【解决方案3】:

      您可以覆盖模型的 init 方法,但这不允许您设置 m2m。

      您可以像这样覆盖模型表单的初始化:

      def __init__(self, *args, **kwargs):
          if 'initial' not in kwargs:
              kwargs['initial'] = {}
          kwargs['initial'].update(product_template_admin_initial_values())
          super(ProductTemplateAdminForm, self).__init__(*args, **kwargs)
      

      但这将不允许使用请求。

      如果您依赖于请求,您可以使用管理员 get_changeform_initial_data

      def get_changeform_initial_data(self, request):
          return {'name': 'custom_initial_value'}
      

      您可以使用请求作为参数调用方法并返回字典。 m2m 默认应该是一个列表

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2015-10-15
        相关资源
        最近更新 更多