Django:通过pk向ManyToMany添加模型,无需获取

时间:2014-03-23 18:34:38

标签: python django orm

我有一个带有ManyToMany的模型A来模型B.我有一个模型B的对象的pk,我想将它添加到模型A的对象的ManyToManyField。是否可以添加它而不需要花费资源从数据库中获取对象b?我已经有了它的pk,我可以在不提取的情况下添加吗?

1 个答案:

答案 0 :(得分:5)

您可以使用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'],这也适用。请记住,如果其中一个pks用于已经相关的对象,则会出现UNIQUE constrained failed错误

如果主键不是整数,这甚至可以工作。假设我将主键定义为长度为15的CharField,并且我有一个对象的主键是Lorem Ipsum',执行此操作:

>>> foo.bars.add('Lorem Ipsum')

会像魅力一样工作!