2011-07-24 7 views
0

追加のカスタムフィールドを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に入れたくないのは、さまざまなフィルタがあり、いくつかのステートメントが必要なためです。

私はこれをどのように正確に行いますか?ありがとうございました。

+1

「余分な」クエリーセット修飾語のようなものを使用できませんでしたか? https://docs.djangoproject.com/en/dev/ref/models/querysets/#extra – niklasdstrom

+0

UserProfile.objects.extra(select = {'count': "SELECT(SELECT COUNT(*)FROM videos_video)v WHERE v。 (%)を入力してください。ここで、pid =%d "%(...)と入力してください。 })。どのように私はそれぞれのprofile.idを取得するので、私は結果を各userprofileに注釈をつけて、その数を数えることができますか? – David542

+0

ps:賞金のための本当の答えに答えを入れることができます。 – David542

答えて

0

"余分なクエリーセット修飾子のようなものを使用できませんでしたか?"それはより多くの(うまくいけばでナッジようなものだった -

は、私はそれが実際に機能することを確認できなかったので、docs

私が最初に答えでこれを入れていなかったか、それはあなたが必要なものだったかどうかを確認します)右方向。そのページのドキュメントで

例おそらくそのような何かをやっているユーザーIDにアクセスするSQL

 
SELECT blog_blog.*, (SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id) AS entry_count 
FROM blog_blog; 

を結果

クエリ

 
Blog.objects.extra(
    select={ 
     'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id' 
    }, 
) 

がありますあなたは現在、appname_userprofile.idと同じp.idを持っています

注:

イムだけで、それはそう少し周りを再生しようとする巻取。 おそらくシェルを使用してsqlとしてクエリを出力し、あなたが得ているものを見てください。

1

私の反応は、あなたが噛むことができるよりも大きな咬合をしようとしていることです。あなた自身をより多くの原始的なものにすることによって、それをバイトサイズの断片に分解してください。あなたはあなたがそれらを呼び出すことができますので、別途これら2つを作成したい

  • このユーザーは、このビデオのためのクレジットを取得していますか?返り値ブール
  • このユーザーは何人のビデオをクレジットしていますか?return int

次に、@プロパティ、モデルマネージャ、クエリーセット、およびメソッドを組み合わせて、必要なものを簡単に表現できるようにします。

たとえば、ユーザーパラメータを使用してビデオモデルに「クレジット」を付けたり、ビデオパラメータを取得するユーザーモデルや、クレジットがあるビデオの数を追加する「クレジット」マネージャをユーザーに追加することができます。

些細なことではありませんが、あなたがそれに取り組むことはあまり面倒ではありません。

0

モデル:

class Positions(models.Model): 
    x = models.IntegerField() 

    class Meta: 
     db_table = 'xtest_positions' 

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    positions = models.ManyToManyField(Positions) 

    class Meta: 
     db_table = 'xtest_users' 

class Video(models.Model): 
    usr = models.ForeignKey(UserProfile) 
    views = models.IntegerField() 

    class Meta: 
     db_table = 'xtest_video' 

結果:

test = UserProfile.objects.annotate(video_views=Sum('video__views')).order_by('video_views') 
for t in test: 
    print t.video_views 

DOC:https://docs.djangoproject.com/en/dev/topics/db/aggregation/

これはどちらかである、あなたは何をしたいか、私は完全に誤解してきました。.. Anywhoo ...願っています!助けになる!

関連する問題