6

我有两个模型以某种方式与“直通”表有多对多关系?

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()

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

4

2 回答 2

7

拥有 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
于 2010-10-02T14:39:16.460 回答
0

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()方法的限制

于 2020-05-24T13:53:36.070 回答