我的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对? (所以我可以在没有额外查询的情况下获得匹配的用户配置文件?)
答案 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')
据我所知,您必须列出所需的所有字段,这种方法会让您感到有点痛苦,但从来没有这么简单。