Django:通过主键添加 ManyToMany 关系,避免取回数据
我有一个模型A,它和模型B之间有多对多的关系。现在我手里有模型B中一个对象的主键(pk),我想把这个对象添加到模型A的多对多字段里。请问,有没有办法在不从数据库中获取模型B对象的情况下直接添加它?因为我已经有了它的主键,能不能直接添加,而不需要去取这个对象?
1 个回答
8
你可以使用 add()
方法。Django 知道如果你传入的是一个数字而不是一个对象,它会把这个数字当作主键来处理:
class Foo(models.Model):
bars = models.ManyToMany('Bar')
class Bar(models.Model):
...
>>> foo = Foo.objects.latest('id') #arbitrary
>>> target_pk = 5
>>>
>>> # method 1:
>>> bar = Bar.objects.get(pk=target_pk)
>>> foo.bars.add(bar)
>>>
>>> # method 2:
>>> foo.bars.add(target_pk) # will work just the same
而且,target_pk 也可以是一个字符串。如果你想添加一组主键,你需要把它们作为参数传入,像这样:
>>> pk_list = [1, 2, 3]
>>> foo.bars.add(*pk_list)
如果这些主键是字符串,这样做也是可以的,比如 pk_list = ['1', '2', '3']
。不过要记住,如果你传入的主键已经和某个对象关联了,你会遇到 UNIQUE constrained failed
的错误。
即使主键不是整数,这种方法也能用。比如,我把主键定义为一个长度为 15 的字符字段,如果我有一个对象的主键是 'Lorem Ipsum',这样做:
>>> foo.bars.add('Lorem Ipsum')
也会顺利运行!