Django ManyToManyField错误对象没有属性'location_set'

时间:2011-04-11 02:00:59

标签: django django-models

这似乎是一个非常微不足道的问题,但它正在扼杀我。

models.py

class Location(models.Model):
    place = models.CharField("Location", max_length=30)
    [...]

class Person(models.Model):
    first = models.CharField("First Name", max_length=50)
    [...]
    location = models.ManyToManyField('Location')

来自shell:

>>> from mysite.myapp.models import *
>>> p = Person.objects.get(id=1)
>>> p
<Person: bob >
>>> l = Location(place='123 Main')
>>> p.location_set.add(l)
>>> p.save()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'Person' object has no attribute 'location_set'

我真的没有看到我失踪的东西。

2 个答案:

答案 0 :(得分:2)

你不应该使用p.location.add()吗? location_set<modelname>_set是该模型的reverse lookup的默认名称。

答案 1 :(得分:1)

location_set将是后向关系的默认名称,但由于您已在ManyToManyField模型上定义了Person,因此您可以通过字段名称访问相关管理器:

p.location.add(l)

考虑到这一点,将ManyToManyField命名为复数名词更有意义,例如

class Person(models.Model):
    first = models.CharField("First Name", max_length=50)
    [...]
    locations = models.ManyToManyField('Location')

此外,从内存中,当您尝试将模型实例添加到多对多关系时,必须在添加之前保存实例。