2016-05-27 6 views
0

Ich habe ein Problem beim Generieren von ORM Abfrage auf Tabellen.Django ORM: Ermitteln Sie dynamisch einen anderen Tabellennamen nach einem Feldwert

Ich habe Modelle hier:

class Task(models.Model): 

    deliver = models.ForeignKey(settings.AUTH_USER_MODEL, blank=False, related_name='task') 
    tasktype = models.PositiveSmallIntegerField(db_index=True) 
    description = models.CharField(max_length=500, null=True, blank=True) 
    delivertime = models.DateTimeField(default=now,db_index=True) 
    deadlinetime = models.DateTimeField(null=True,db_index=True) 
    relatedresourceid = models.PositiveIntegerField(null=True) 
    suggestspendtime = models.PositiveIntegerField(null=True) 
    subjectid = models.PositiveIntegerField(null=True) 

class Lesson(models.Model): 
    name = models.CharField(max_length=200,null=True,blank=True) 

class Exam(models.Model): 
    name = models.CharField(max_length=200,null=True,blank=True) 

So, hier bin Abfrage von Task-Modell will, was mehr ist, für jede Aufgabe Objekt in queryset:

Ich möchte einen Wert mit Schlüssel "name" erhalten aus Lesson oder Exam-Modell, dh für jedes Task-Objekt, wenn tasktype 1 ist, dann Name Wert aus Lesson-Modell (pk==relatedresourceid), wenn tasktype ist 2, dann nehmen Sie es aus Exam-Modell.

Ich benutze Django1.8 und Mysql 5.6

Wer weiß, wie ORM abzufragen?

Danke.

+0

Gehört jede Aufgabe entweder zu einer Lektion oder zu einer Prüfung? In dem realen Problem, das du versuchst zu lösen, meine ich. – trinchet

+0

Ja, jede Aufgabe gehört entweder zu einer Lektion oder zu einer Prüfung. Wenn tasktype 1 ist, ist es Lektion, 2 ist für Prüfung. Und bekommen Lektion oder Prüfung Objekt von relatedresourceid – Wesley

+0

Dann sollten Sie die Situation auf eine andere Art und Weise modellieren, nehmen Sie meine Antwort unter – trinchet

Antwort

0

Sie sollten die Situation auf eine andere Weise modellieren:

class Task(models.Model): 
    deliver = models.ForeignKey(settings.AUTH_USER_MODEL, blank=False, related_name='task') 
    tasktype = models.PositiveSmallIntegerField(db_index=True) 
    description = models.CharField(max_length=500, null=True, blank=True) 
    delivertime = models.DateTimeField(default=now,db_index=True) 
    deadlinetime = models.DateTimeField(null=True,db_index=True) 
    relatedresourceid = models.PositiveIntegerField(null=True) 
    suggestspendtime = models.PositiveIntegerField(null=True) 
    subjectid = models.PositiveIntegerField(null=True) 

class Lesson(models.Model): 
    name = models.CharField(max_length=200,null=True,blank=True) 
    tasks = models.ManyToManyField(Task, related_name='lessons') 

class Exam(models.Model): 
    name = models.CharField(max_length=200,null=True,blank=True) 
    tasks = models.ManyToManyField(Task, related_name='exams') 

Auf diese Weise können Sie bequem den Namen der Lektion oder Prüfung der Task gehört zu <a task>.lessons oder <a task>.exams

Für Ihre aktuelle Ansatz haben kann, Sie können alle Namen auf diese Weise nehmen:

[{'task_id':task.pk, 'name': Lesson.objects.get(pk=task.relatedresourceid).name if task.tasktype==1 else Exam.objects.get(pk=task.relatedresourceid).name} for task in Task.objects.all()] 

Dies wird Ihnen eine Liste wie: [{'task_id':1, 'name': <Lesson or Exam name 1>}, {'task_id':2, 'name': <Lesson or Exam name 2>}, ..., {'task_id':N, 'name': <Lesson or Exam name N>}]

+0

Kann nicht fremeighkey oder manytomanyfield, außer relatedresourceid wir brauchen auch tasktype, um Lesson oder Exam-Objekt zu adressieren. – Wesley

+0

Tut mir leid, Kumpel, ich muss für eine Weile gehen, wird dir antworten, wenn zurück. Vielen Dank. – Wesley

+0

Vielleicht habe ich meine Frage nicht detaillierter beschrieben. Ich möchte das Queryset nicht noch einmal durchlaufen. Wenn ja, kann ich das Ergebnis ohne ein verwandtes Feld erhalten. Was ich frage ist, könnten wir das Ergebnis von einer ORM Abfragezeichenkette erhalten? – Wesley

Verwandte Themen