我可以将经理添加到多人关系中吗?

时间:2010-10-02 13:09:40

标签: django django-models manytomanyfield

我有两个模型在某种程度上与'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()

实现这一目标的最佳方法是什么?

2 个答案:

答案 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)

django 2.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'

source of example

记住有关{strong> get_queryset()方法的restrictions