我有两个模型在某种程度上与'through'表有很多关系吗?
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()
实现这一目标的最佳方法是什么?
答案 0 :(得分:6)
拥有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 Model中使用它:
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
答案 1 :(得分:0)
use_for_related_fields 。可以通过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'
记住有关{strong> get_queryset()方法的restrictions。