2011-08-19 85 views
2

我有以下型號:Django的跨越多值關係

class Sked(models.Model): 
    pass 

class Class(models.Model): 
    class_key = models.CharField(max_length=20, null=True) 
    name = models.CharField(max_length=150) 

class Sked_class(models.Model): 
    class_room = models.CharField(max_length=100, null=True) 
    sked = models.ForeignKey(Sked) 
    class_took = models.ForeignKey(Class) 

class User(djmodels.User): 
    sked = models.ForeignKey(Sked, null=True) 

我要作出這樣的選擇特定用戶,走的是所有類的查詢,但我仍然不能得到的想法如何在不使用SQL的情況下做到這一點,我已閱讀此文件https://docs.djangoproject.com/en/dev/topics/db/queries/,但我仍然不明白,如何通過此模型跨越多值關係?

回答

2

您正在尋找兩件事 - 如何跨越外鍵,以及如何返回一組不包含重複項的獨特類。

您使用__跨越外鍵來分隔關係,並在查詢集上使用distinct()來過濾出重複項。請記住,外鍵關係與Django語法一起工作,因爲ORM將識別反向關係。這應該工作:

user = User.objects.get(id=1) 
Class.objects.filter(sked_class__user=user).distinct() 

但是,我不清楚,如果你的數據模型是合理的,但是。我想這更有意義:

class Class(models.Model): 
    key = models.CharField(max_length=20, null=True) 
    name = models.CharField(max_length=150) 

class Schedule(models.Model): 
    student = models.ForeignKey(User) 
    classes = models.ManyToManyField(Class) 

然後你會說:

user = User.objects.get(id=1) 
Class.objects.filter(schedule__student=user) 
+0

非常感謝你!,現在我明白了。關於你對數據模型的建議我認爲你的建議可以更好地工作如果我對整個數據模型做一些小的修改,但問題是我沒有共享數據模型的所有結構和應用程序邏輯它。但我會考慮。 – ElHacker