我有两个模型以某种方式与“通过”表有许多关系?
class Bike(models.Model):
nickname = models.CharField(max_length=40)
users = models.ManyToManyField(User, through='bike.BikeUser')
BikeUser类
class BikeUser(models.Model):
bike = models.ForeignKey(Bike)
user = models.ForeignKey(User)
comment = models.CharField(max_length=140)
我想在Bike类中添加功能以便与用户合作,是否有最佳实践方法?我想避免在Bike类中添加过多的方法,而希望通过某种管理器来完成]
类似:
bike.bikeusers_set.commonMethod()
或
bike.bikeusers.commonMethod()
什么是最好的方法?
一旦有了BikeUser模型,就可以向该模型添加一个自定义管理器。
类似:
class BikeUserManager(models.Manager):
def commonMethod():
pass
class BikeUser(models.Model):
bike = models.ForeignKey(Bike)
user = models.ForeignKey(User)
comment = models.CharField(max_length=140)
objects = BikeUserManager()
但是您只能在BikeUser模型中使用它:
BikeUser.objects.commonMethod()
[您要使用此管理员作为相关管理员:http://docs.djangoproject.com/en/dev/topics/db/managers/#controlling-automatic-manager-types
将use_for_related_fields=True
添加到经理类。
class MyManager(models.Manager):
use_for_related_fields = True
use_for_related_fields从Django 2.0中已弃用。可以通过base manager用于相关字段。
旧:
class CustomManager(models.Model):
use_for_related_fields = True
class Model(models.Model):
custom_manager = CustomManager()
新:
class Model(models.Model):
custom_manager = CustomManager()
class Meta:
base_manager_name = 'custom_manager'
记住get_queryset()方法的restrictions。