0

Django の ORM を使用して複雑なクエリを実行しようとしていますが、適切な解決策が見つからないようです。つまり、ユーザーがビデオに基づいて質問に答える Web アプリケーションがあります。少なくとも 1 つの質問が未回答 (未回答) である、指定されたユーザーのすべてのビデオを表示する必要があります。私はまだ ORM を使ってそれを理解することができませんでした...私はおそらくこれのための SQL クエリを書き、生の SQL 関数でそれを実行できることを知っていますが、私は本当に ORM にとどまることを好みます.

モデル: ビデオ、質問、応答、およびデフォルトのユーザー。

関係:

  • 質問はビデオに対して多対多の関係があります
  • 応答には、質問、ビデオ、およびユーザーへのそれぞれの外部キーがあります

クエリで行う必要があること:

  • 未回答のビデオ質問が 1 つ以上ある、指定されたユーザーのすべてのビデオを表示します。

どんな助けでも素晴らしいでしょう!私はこれに長い間苦労してきました。

編集:私が持っているモデルは(簡略化):

class Video(TimeStampedModel):

     title = models.CharField(max_length=200)
     source_id = models.CharField(max_length=20)


class Question(TimeStampedModel):

    DEMOGRAPHIC_QUESTION = 'd'
    QUESTION_TYPES = (
        (VIDEO_QUESTION, 'Video related question'),
        (DEMOGRAPHIC_QUESTION, 'Demographic question'),
    )

    MULTIPLE_CHOICE = 0
    PLAIN_TEXT = 1
    RESPONSE_TYPE = (
        (MULTIPLE_CHOICE, 'Multiple Choice'),
        (PLAIN_TEXT, 'Plain Text')
    )

    type = models.CharField(max_length=1, choices=QUESTION_TYPES)
    videos = models.ManyToManyField(Video, null=True, blank=True)
    title = models.CharField(max_length=500)
    priority = models.IntegerField()

class Response(TimeStampedModel):
     user = models.ForeignKey(User)
     question = models.ForeignKey(Question)
     video = models.ForeignKey(Video, blank=True, null=True)
     choice = models.ForeignKey(Choice, null=True, blank=True,related_name='selected_choice')
     text = models.CharField(max_length=500, blank=True)

// Not relevant but included for clarity
class Choice(TimeStampedModel):
     question = models.ForeignKey(Question)
     text_response = models.CharField(max_length=500)
     image = models.FileField(upload_to=_get_choice_img_path, blank=True)
     value = models.IntegerField(default=0)
     external_id = models.IntegerField(default=0)
4

1 に答える 1

0

モデルの見た目から論理的に判断すると、次のようなもので十分だと思います。

q = Response.objects.select_related().filter(user__name=user).filter(response__choice=None)

videos = Video.objects.filter(id__in=q.extra(where=["{}>=1".format(q.count())]).values('video_id'))

私がそこで何をしたか理解していただければ幸いです。最初の行は、基本的にモデル オブジェクトの自然な結合を試みます。2 行目では、1 行目で生成されたクエリを使用してカウントを取得し、少なくとも 1 かどうかを確認して、そのクエリに属する​​動画を取得します。

于 2013-06-22T10:30:46.923 に答える