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_FIELD
和my_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 添加对象
Django / Python - 在对象创建中使用ManyToMany字段