Я использую Django Managers, чтобы создать API более высокого уровня для взаимодействия с мою базу данных и сделать мой код чище и читабельнее. Но в случае, если у меня отношение Foreignkey
, я не могу использовать менеджер модели ForeignKey. Запросы более сложные, как показано ниже, но я просто упростил пример, чтобы его было легче читать и понять вопрос:
models.py:
class Community(models.Model):
objects = CommunityManager()
...
class Inscription(models.Model):
objects = InscriptionManager()
...
community = models.ForeignKey("Community", related_name="inscriptions")
created_at = models.DateTimeField()
managers.py:
from datetime import date
from django.db import models
class InscriptionQuerySet(models.query.QuerySet):
def by_day(self, day=date.today()):
return self.filter(created_at__day=day)
... # more queries
class InscriptionManager(models.Manager):
def get_query_set(self):
return InscriptionQuerySet(self.model, using=self._db)
def today(self):
return self.get_query_set().by_day()
... # more queries
class CommunityQuerySet(models.query.QuerySet):
def by_type(self, type):
return self.filter(type=type)
... # more queries
class CommunityManager(models.Manager):
def get_query_set(self):
return OrganistaionQuerySet(self.model, using=self._db)
def by_type(self, type):
return self.get_query_set().by_type(type)
... # more queries
Использование:
Inscription.objects.by_day() # return correctly all the inscriptions made today
Community.objects.by_type('type1') # return correctly all Communities that match
Проблема: но вот в чем проблема
community_b = Community.objects.get(id=12)
community_b.inscriptions.by_day()
>>> AttributeError: 'ForeignRelatedObjectsDescriptor' object has no attribute 'by_day'
Как это исправить. Как настроить менеджер так, чтобы он учитывал взаимосвязь моделей.
use_for_related_fields = True
кInscriptionManager
? Проверьте это: docs.djangoproject.com/ ru/1.9/topics/db/managers/ - person Rohit Jain   schedule 17.12.2015QuerySet
иManager
для обеих моделей? - person Rohit Jain   schedule 17.12.2015QuerySet
и назначить объекты в вашей моделиInscriptionQuerySet.as_manager()
? Я так думаю, должно работать. Меня устраивает. - person Rohit Jain   schedule 17.12.2015by_day()
уже находится вInscriptionQuerySet
, но вы пытаетесь получить к нему доступ вInscriptionManager
. Как это работает? Что это заAnreiseQuerySet
в методе вашего менеджераget_query_set()
? - person Rohit Jain   schedule 17.12.2015