2011-05-22 118 views
0

我有Django模型与一个throughmanytomany连接:Django的多对多,并通过对

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对呢? (所以我可以得到匹配的用户配置文件无需额外的查询?)

回答

1

您可以在UserCoupons直接查询和使用select_related()在一个查询中也获取了相关对象:

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

注意select_related()没有按” “向后”工作。这就是为什么您需要使用定义ForeignKey的类的经理来使其工作(在这种情况下为UserCoupons)。

+0

好的,但我如何得到两个对象呢?我得到一个优惠券对象列表 – 2011-05-26 07:56:32

+0

'user_coupon = UserCoupons.objects.select_related()。get(** filter);打印user_coupon.user;打印user_coupon.coupon;' – 2011-05-26 10:18:49

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') 

你必须列出所有你需要的领域,据我所知,有这种方法使得它有点痛苦,但永远不会少于它的选择。