2017-07-09 1 views
0

Zu jeder Frage gibt es viele Antworten. Ich habe eine Tabelle Vote, die die Upvote/Downvotes zu allen Fragen und Antworten enthält. Ich möchte eine Abfrage so etwas wie ausführen:Führen Sie WHERE "Feld" IN (Liste) Abfrage in Django?

Select * from Abstimmung WHERE username = "some username" AND (QID = "Frage" OR (AID IN (SELECT AID von Antworten WHERE QID = "Frage")))

class Question(models.Model): 
    QID = models.CharField(default="",max_length=5, primary_key=True) 
    title = models.CharField(max_length=30, default="") 
    description = models.CharField(max_length=1055, default="") 
    date = models.DateTimeField(default=datetime.now, blank=True) 
    username = models.CharField(max_length=30, default="") 
    votes = models.IntegerField(default=0) 
    approved = models.BooleanField(default=False) 

    def __str__(self): 
     return self.title 


class Answer(models.Model): 
    AID = models.CharField(max_length=5, default="", primary_key=True) 
    QID = models.ForeignKey(Question,on_delete=None) 
    description = models.CharField(max_length=1055, default="") 
    date = models.DateTimeField(default=datetime.now, blank=True) 
    username = models.CharField(max_length=30, default="") 
    votes = models.IntegerField(default=0) 
    approved = models.BooleanField(default=False) 

    def __str__(self): 
     return self.AID 

class Vote(models.Model): 
    username = models.ForeignKey(User,on_delete=None) 
    QID = models.ForeignKey(Question,on_delete=None, null=True, blank=True) 
    AID = models.ForeignKey(Answer,on_delete=None, null=True, blank=True) 
    vote = models.BooleanField(default=True) 

    def __str__(self): 
     if self.QID is not None: 
      return self.QID.QID+'_'+self.username.username+'_'+str(self.vote) 
     else: 
      return self.AID.AID+'_'+self.username.username+'_'+str(self.vote) 

PS Bitte beachten Sie, dass QID und AID Fremdschlüssel sind. Sie nehmen also nur das Frage/Antwort-Modell.

Antwort

1

Sie tun könnten,

from django.db.models import Q 

Vote.objects.filter(username='some_username').filter(
         Q(QID=question_id) | 
         Q(AID__QID=question_id 
         ) 

HINWEIS: Stimme voll und ganz mit der Antwort @ schillingt.

Oder, wenn Sie all Vote Objekte einer Frage erhalten mögen, dann könnte man die umgekehrte Beziehung nennen wie,

question = Question.objects.get(QID='some_id') 
question.vote_set.all() 
+0

Welche Bedeutung hat dieser Teil? '.values_list ('AID', flach = True)' –

+0

values_list() gibt eine Liste von Feldwerten von Objekten im Abfrage-Set zurück. – zaidfazil

0

Ich glaube, ein besserer Weg, dies zu tun wäre:

from django.db.models import Q 

Vote.objects.filter(username='some_username').filter(
    Q(QID=question_id) | 
    Q(AID___QID=question_id) 
) 

Es vermeidet die zusätzliche Abfrage in der Antwort von Fazil Zaid, die benötigt wird, um die Antwort-IDs für eine gegebene Fragen-ID zu erhalten, indem sie das innerhalb der einzelnen Abfrage durchführt.

Verwandte Themen