Я пытаюсь добавить дополнительное настраиваемое поле в модель django. Мне было довольно трудно понять, как сделать следующее, и я буду назначать вознаграждение в размере 150 баллов за первый полностью правильный ответ, когда он станет доступен (после того, как он будет доступен — см. ссылка Улучшение кода представления Python/django).
У меня есть следующая модель с пользовательским определением, которое возвращает количество видео для каждого пользователя:
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
positions = models.ManyToManyField('Position', through ='PositionTimestamp', blank=True)
def count(self):
from django.db import connection
cursor = connection.cursor()
cursor.execute(
"""SELECT (
SELECT COUNT(*)
FROM videos_video v
WHERE v.uploaded_by_id = p.id
OR EXISTS (
SELECT NULL
FROM videos_videocredit c
WHERE c.video_id = v.id
AND c.profile_id = p.id
)
) AS Total_credits
FROM userprofile_userprofile p
WHERE p.id = %d"""%(int(self.pk))
)
return int(cursor.fetchone()[0])
Я хочу иметь возможность упорядочивать по количеству, т.е. UserProfile.objects.order_by('count')
. Конечно, я не могу этого сделать, поэтому и задаю этот вопрос.
Раньше я пытался добавить пользовательский диспетчер моделей, но проблема заключалась в том, что мне также нужно иметь возможность фильтровать по различным критериям модели UserProfile: В частности, мне нужно уметь делать: UserProfile.objects.filter(positions=x).order_by('count')
. Кроме того, мне нужно оставаться в ORM (не может иметь необработанный вывод sql), и я не хочу помещать логику фильтрации в SQL, потому что существуют различные фильтры, и для этого потребуется несколько операторов.
Как именно я буду это делать? Спасибо.