Django跨越多值关系

时间:2011-08-19 22:25:37

标签: django django-models

我有以下型号:

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/,但是我仍然没有得到它,我怎样才能通过这个模型跨越多值关系?

1 个答案:

答案 0 :(得分: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)