Мне нужен пользовательский менеджер для Amodel, содержащий ForeignKey.Правильное использование моделей django.Manager для связанных объектов
class AvailableManager(models.Manager):
use_for_related_fields = True
def sample(self):
from django.db import connection
cursor = connection.cursor()
cursor.execute(""" SELECT * FROM anapp_amodel """)
result_list = []
for row in cursor.fetchall():
p = self.model(id=row[0])
result_list.append(p)
return result_list
class Amodel(models.Model):
related_model = models.ForeignKey('AnotherModel', unique=True)
name = models.CharField(max_length=255, blank=True, null=True)
objects = models.Manager()
available = AvailableManager()
def __unicode__(self):
return 'Amodel related to '+unicode(self.related_model)
Этой реализация поднимает RelatedObjectDoesNotExist исключения при использовании менеджера:
>>> Amodel.available.sample()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File ".../.virtualenvs/venv/lib/python2.7/site-packages/django/db/models/base.py", line 459, in __repr__
u = six.text_type(self)
File ".../anapp/models.py", line 32, in __unicode__
return u'Amodel at '+unicode(self.related_model)
File ".../.virtualenvs/venv/lib/python2.7/site-packages/django/db/models/fields/related.py", line 578, in __get__
"%s has no %s." % (self.field.model.__name__, self.field.name)
RelatedObjectDoesNotExist: Amodel has no related_model.
Что такое правильный способ выполнения необработанного SQL относительно смежных областей? Цель состоит в том, чтобы выполнить сложный SQL-запрос и аннотировать результаты.
UPDATE: Это нормально, что исключение RelatedObjectDoesNotExist возникает из-за строки p = self.model(id=row[0])
. Было бы разумно заменить его на self.model.objects.get(id=row[0])
, чтобы получить экземпляр, что позволило разрешить смежные поля?
Спасибо, Дэниэл, только что понял это. Пример кода (в частности, «" SELECT * FROM ... "" ") предназначен для иллюстративных целей. Мой вариант использования включает тяжелый SQL-запрос здесь и некоторые аннотации. Разве это не цель заказных менеджеров моделей? –
Список «идея» происходит отсюда: https://docs.djangoproject.com/en/1.7/topics/db/managers/#adding-extra-manager-methods –
re. ваше редактирование, как можно добавить аннотации? –