Django ManyToMany Field add() 不起作用

Posted

技术标签:

【中文标题】Django ManyToMany Field add() 不起作用【英文标题】:Django ManyToMany Field add() not working 【发布时间】:2016-01-02 15:01:18 【问题描述】:

我的 Django 模型中有一个字段定义为:

def get_field(**kwargs):
    kwargs.setdefault('related_name', '+')
    return models.ManyToManyField('app.MyOtherModel', **kwargs)

class MyModel(models.Model):
    MY_FIELD = 'A label for my field'
    my_field = get_field() # wrote function to DRY creation of fields

但每当我尝试向该字段添加内容时,它都不起作用:

foo = MyOtherModel.objects.create(...)
m = MyModel.objects.get(...)
m.my_field.add(foo)
m.my_field.all() # returns []

深入研究 Django 源代码,ManyRelatedManager.add() 函数(在 django/db/models/fields/related.py 中)工作正常,self.through.objects.all() 在函数末尾返回正确的对象,但 self.all() 没有,引导我认为问题出在get_queryset():

# printing self.through.objects.all() @ related.py:978
[<MyModel_myothermodel: MyModel_myothermodel object>]

# printing self.all() @ related.py:978
[]

问题是否在于我在MyModel 中同时定义了MY_FIELDmy_field?或者也许是我如何生成ManyToManyField?还是有其他问题?

更新:问题出在related.py 中的get_queryset 函数中。 self.core_filters 设置为'+__year': 2015,但是,当我查询qs.values('+__year') 时,我得到'+__year': None。 (year 是模型中的另一个字段)

【问题讨论】:

您通常不应该搞乱字段的定义方式。有很多元类的东西可以使声明性语法起作用,我怀疑它是否可以与您的单独函数一起使用。 为什么你的my_field 有奇怪的设置?普通的 m2m 字段不会做你的工作吗? Roseman- 迁移文件有效。你还觉得不是最好的吗?如果我改用MY_FIELD_LABEL 会更好吗? // Wang- 奇怪的设置是因为我有大约 50 个 ManyToMany 字段,我希望能够从类级别访问字段的名称。 我不确定我是否曾经对某人在做什么以及为什么这么好奇,因为这个问题......你可能不想透露更多关于它的信息,但我肯定很好奇是否你不介意透露更多..?也许完全有更好的方法..? 【参考方案1】:

我想我在旧的 Django 文档中找到了答案:https://docs.djangoproject.com/en/1.4/ref/models/fields/#django.db.models.ManyToManyField.related_name

我需要指定唯一的related_name 值,即使我使用+。所以我需要做related_name='foo+'related_name='bar+'

【讨论】:

以上是关于Django ManyToMany Field add() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 的 ManyToMany 关系中按 id 添加对象

python django的ManyToMany简述

Django / Python - 在对象创建中使用ManyToMany字段

Django 模型 ManytoMany getter

有多少种方法可以使用 Django ORM 获取 ManyToMany 字段数据

Django:快速检索manyToMany字段的ID