为什么我的django manytomany只允许通过related_name访问?

时间:2014-05-23 11:40:09

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

我有这些模型

class Collection(models.Model):
    items = models.ManyToManyField('Item', through='CollectionItem', related_name='collection_items')
    ...

class Item(models.Model):
    ...

class CollectionItem(models.Model):
    collection = models.ForeignKey(Collection)
    item = models.ForeignKey(Item)
    extra_stuff = models.CharField(max_length=100)

我是否以错误的方式思考这个问题,或者我应该能够使用

访问与集合相关的“通过”对象
collection = get_object_or_404(Collection, pk=1)
collection.collectionitem_set.all()

因为我刚收到一个属性错误?

但是我可以通过related_name

访问它们
collection = get_object_or_404(Collection, pk=1)
collection.collection_items.all()

我错过了一些非常明显的东西吗?为什么不使用'collectionitem_set'工作?

修改

刚刚注意到一个重要的遗漏,这就是collection.collection_items.all()的工作原理。我在CollectionItem上设置了相同的related_name

class CollectionItem(models.Model):
    collection = models.ForeignKey(Collection, related_name='collection_items')
    item = models.ForeignKey(Item)
    extra_stuff = models.CharField(max_length=100)

一旦我删除了它,两种方式都无效。

1 个答案:

答案 0 :(得分:1)

我无法重复。使用您的模型以及其他name字段:

>>> from models import Collection, Item, CollectionItem
>>> c = Collection.objects.create(name='coll1')
>>> c.collectionitem_set.all()
[]