追加のカスタムフィールドをdjangoモデルに追加しようとしています。 最初に完全に正しい答えが利用可能になった時点で、150ptの賞金を授与させていただきます(利用可能になった後はImproving Python/django view code参照)。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(raw SQL出力を持つことはできません)にとどまる必要があります。フィルタリングロジックをSQLに入れたくないのは、さまざまなフィルタがあり、いくつかのステートメントが必要なためです。
私はこれをどのように正確に行いますか?ありがとうございました。
「余分な」クエリーセット修飾語のようなものを使用できませんでしたか? https://docs.djangoproject.com/en/dev/ref/models/querysets/#extra – niklasdstrom
UserProfile.objects.extra(select = {'count': "SELECT(SELECT COUNT(*)FROM videos_video)v WHERE v。 (%)を入力してください。ここで、pid =%d "%(...)と入力してください。 })。どのように私はそれぞれのprofile.idを取得するので、私は結果を各userprofileに注釈をつけて、その数を数えることができますか? – David542
ps:賞金のための本当の答えに答えを入れることができます。 – David542