2011-08-19 47 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