Django manytomany并通过配对

时间:2011-05-22 16:40:53

标签: django django-models join

我的django模型与manytomany类的through连接:

class userProfile(models.Model):
    boughtCoupons = models.ManyToManyField(Coupon, through='UserCoupons')

class UserCoupons(models.Model):
    user = models.ForeignKey(userProfile)
    coupon = models.ForeignKey(Coupon)
    date = models.DateField()


class Coupon(models.Model):
    name = models.CharField(max_length=10)

我知道如何使用和ID或其他东西单独过滤它们。

但是,我需要通过所有用户的详细信息(个人资料)获取通过表的值。

那么如何在JOIN中执行某些操作,并在单个查询中获取UserCoupons + userProfile对? (所以我可以在没有额外查询的情况下获得匹配的用户配置文件?)

2 个答案:

答案 0 :(得分:1)

您可以直接在UserCoupons上进行查询,并使用select_related()在一个查询中获取相关对象:

UserCoupons.objects.select_related().filter(**your_filters)

请注意,select_related()无效“向后”。这就是为什么你需要使用定义ForeignKey的类的管理器来使其工作(在这种情况下为UserCoupons)。

答案 1 :(得分:1)

如果您使用的是Django 1.2或更低版本,那么据我所知,jkbrzt的答案是唯一的解决方案,因为在不使用原始SQL的情况下让Django生成JOIN的唯一方法是使用select_related()或者Django的double_ 下划线表示法 - 它们都不适用于Django 1.2或更低版本中的多对多关系。但是,Django的双 _underscore符号在Django 1.3中用于多对多,因此您可以执行以下操作:

userProfile.objects.values('boughtCoupons__name', 'usercoupons__date')

据我所知,您必须列出所需的所有字段,这种方法会让您感到有点痛苦,但从来没有这么简单。