Могу ли я добавить менеджера во многие отношения? - PullRequest
5 голосов
/ 02 октября 2010

У меня есть две модели, которые в некотором роде имеют много взаимосвязей со сквозной таблицей?

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

Каков наилучший способ сделать это?

1 Ответ

6 голосов
/ 02 октября 2010

Получив модель 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
...