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
(但它有效)而不是区对象。
你知道在一次通话中做出任何解决方案吗?非常感谢。
答案 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],
)