Django:如何在1 create()中链接2个add()调用?

时间:2015-07-10 13:19:52

标签: python django

class District(models.Model):
    name = models.CharField(max_length=200)
    transports = models.ManyToManyField(TransportWay)
    schools = models.ManyToManyField(School)

我想做这样的事情:

District.objects.create(name="Arc de Triomphe")\
        .transports.add(tr_m1, tr_m2)\
        .schools.add(sc_dauph)

它不起作用,因为District.objects.create(name="Arc de Triomphe").transports.add(tr_m1, tr_m2)返回None(但它有效)而不是区对象。

你知道在一次通话中做出任何解决方案吗?非常感谢。

1 个答案:

答案 0 :(得分:3)

就SQL查询而言,进行第一次链接没有任何好处,

District.objects.create(name="Arc de Triomphe")\
    .transports.add(tr_m1, tr_m2)

因为它使用了同样多的查询。

所以你可以做很多事情。

district = District.objects.create(name="Arc de Triomphe")\
district.transports.add(tr_m1, tr_m2)
district.schools.add(sc_dauph)

如果您担心交易,请使用atomic装饰器。

如果您的担忧是可读性,那么我认为值得担心。攻击add()以返回您要添加的对象会让其他用户感到惊讶,他们希望它返回None。如果您使用\进行换行,则它使用与将创建的对象分配给另一个变量一样多的代码行。

如果你真的担心重复,那么你可以创建一个帮助函数,例如create_district,然后按如下方式调用:

create_district(
    name="Arc de Triomphe",
    transports=[tr_m1, tr_m2],
    schools=[sc_dauph],
)