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

问题描述 投票:5回答:2

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

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

什么是最好的方法?

django django-models manytomanyfield
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

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'

source of example

记住get_queryset()方法的restrictions

© www.soinside.com 2019 - 2024. All rights reserved.