我在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
?还是有其他问题?
UPDATE:问题在get_queryset
函数中的related.py
中。self.core_filters
设置为{'+__year': 2015}
,但是,当我查询qs.values('+__year')
时,我得到{'+__year': None}
。(year
是模型中的另一个字段)
我想我在旧的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+'