这似乎是一个非常微不足道的问题,但它正在扼杀我。
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'
我真的没有看到我失踪的东西。
答案 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')
此外,从内存中,当您尝试将模型实例添加到多对多关系时,必须在添加之前保存实例。