2012-07-26 56 views
0

我需要有一个用户没有任何组的视图。我曾试着与.except查询,但它已经失败,因为多对多领域...ManyToMany字段的查询

我的模型:

class UserProfile(models.Model): 
    user = models.OneToOneField(User, unique=True) 
    courses_list = models.ManyToManyField('Course', blank=True) 
    group_list = models.ManyToManyField('Group', blank=True) 

class Group(models.Model): 
    name = models.CharField(max_length=30) 
    assignment = models.ForeignKey(Assignment) 
    members = models.ManyToManyField(UserProfile, through=UserProfile.group_list.through, blank=True) 

class Assignment (models.Model): 
    course = models.ForeignKey(Course) 

class Course(models.Model): 
    subscribed = models.ManyToManyField(UserProfile, through= UserProfile.courses_list.through, blank=True) 

所以,我需要选择订阅分配用户(assignment.course.subscribed.all发送所有)没有任何组(问题是我需要照顾与此作业相关的组)

我试过groupless = detailedassignment.course.subscribed.exclude(username = group_list.filter(assignment=detailedassignment).members.username.all())但它根本不起作用(我认为这是正常的,当我看代码..)

编辑:在某种程度上

我已删除的关系,我现在的机型有:

My models : 

class UserProfile(models.Model): 
    user = models.OneToOneField(User, unique=True) 

class Group(models.Model): 
    name = models.CharField(max_length=30) 
    assignment = models.ForeignKey(Assignment) 
    members = models.ManyToManyField(UserProfile, blank=True) 

class Assignment (models.Model): 
    course = models.ForeignKey(Course) 

class Course(models.Model): 
    subscribed = models.ManyToManyField(UserProfile, blank=True) 

我曾尝试使用:

groupless = detailedassignment.course.subscribed.exclude(user__username__in = Group.objects.filter(assignment=detailedassignment).members.objects.values_list('user__username')) 

但我有'QuerySet' object has no attribute 'members'

回答

1

你忘记了user参考。所以,如果我理解你正确,你想要的东西类似 -

groupless = detailedassignment.course.subscribed.exclude(user__username__in = group_list.filter(assignment=detailedassignment).members.objects.values_list('user__username')) 

或尝试这一点 -

groupless = UserProfile.objects.filter(courses_list__assignment = detailedassignment).exclude(group_list__assignment=detailedassignment) 

而且顺便说一句,你的模型设计看起来有点歪斜,跨越彼此运行相同的引用。并且不需要添加反向引用(比如在“课程”模型中)。 Django为您提供了反向引用的功能。见https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward

+0

是的,我也不喜欢它,但我有一个问题,这是一个解决方案(丑陋,我同意)。 http://stackoverflow.com/questions/11509077/load-in-a-multiplechoicefield-values-from-a-manytomany-field – nlassaux 2012-07-26 12:13:13

+0

我尝试你的解决方案! :D – nlassaux 2012-07-26 12:13:37

+0

真的非常感谢!对于信息**第二个**只是**完美**! – nlassaux 2012-07-26 12:19:00

0

所以,当后方基准已被删除,我用我的ManyToManyField一个related_name和拉胡尔的一个小编辑答案:

groupless = User.objects.filter(course_list__assignment=detailedassignment).exclude(group_list__assignment=detailedassignment) 

如果它是有用的..:d