无法获取Django ManyToMany Model对象的句柄

时间:2014-08-20 16:21:39

标签: python django

我有一个简单的成员示例,以及Django应用程序中的MemberGroup类。我想要以下数据表示,但我不确定我是否通过使用ManyToMany关系使事情变得复杂:

成员:
1 - 会员1 2 - 会员2 3 - 会员3

组:
1 - 组1 2 - 组2 3 - 组3

MemberGroup:
1 - Member1 / Group1
2 - Member1 / Group2
3 - Member2 / Group3等。

我有以下课程:

class Member(models.Model):
    nickname = models.CharField(max_length=30, blank=False)
    paid = models.BooleanField(default=False)

class MemberGroup(models.Model):
    member = models.ManyToManyField(Member)
    group_name = models.CharField(max_length=50, db_index=True)
    description = models.CharField(max_length=255)

我希望能够在其他模型类中使用id / member / group的组合(比如说可能是BlogPost(MemberGroupId,post)),但我不知道如何处理当前模型生成正确的数据库表,我不知道如何获取代表链接表的对象的句柄。在Django shell中,当我得到MemberGroup(id = 1)时尝试打印与该MemberGroup关联的成员,我得

 <django.db.models.fields.related.ManyRelatedManager object at 0x2ae6c10>

我是否需要创建另一个类Group,然后让Member和Group成为MemberGroup类中的外键以完成我需要的或者我可以使用当前的设置?谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

首先,我会做这样的模型:

from django.db import models

class Group(models.Model):
    group_name = models.CharField(max_length=50, db_index=True)
    description = models.CharField(max_length=255)

class Member(models.Model):
    nickname = models.CharField(max_length=30, blank=False)
    paid = models.BooleanField(default=False)
    groups = models.ManyToManyField(Group)

然后你可以这样做:

>>> test_group = Group(group_name='Admin', description='Admin group')
>>> test_group.save()
>>> m1 = Member(nickname='Robert')
>>> m1.save()
>>> m1.groups.add(test_group)
>>> m1.save()
>>> m1.groups.all()
[<Group: Group object>]
>>> test_group.objects.get(group_name='Admin').member_set.all()
[<Member: Member object>]

该代码创建一个组“Admin”,然后创建一个成员“Robert”。它将“Robert”用户与“Admin”组相关联。然后,我可以使用member_set返回“管理员”组的所有成员。

编辑:将ManyToMany字段放在Group模型中引用成员并没有什么错误,但似乎(对我而言)将成员与组关联起来更合乎逻辑而不是一个小组成员。

答案 1 :(得分:0)

因此,再次阅读与many_to_many关系相关的文档为我提供了正确的解决方案,正在使用这个&#34;通过&#34;在模型上的名称。我的模特现在看起来像这样:

class Member(models.Model):
    nickname = models.CharField(max_length=30, blank=False)
    paid = models.BooleanField(default=False)

class Group(models.Model):
    group_name = models.CharField(max_length=50, db_index=True)
    description = models.CharField(max_length=255)
    created_by = models.ForeignKey('Member', related_name='created_by')
    created_date = models.DateTimeField(auto_now=True)
    members = models.ManyToManyField(Member, through="Membership")

    def __unicode__(self):
        return self.group_name

class Membership(models.Model):
     member = models.ForeignKey(Member)
     group = models.ForeignKey(Group)
     active = models.BooleanField(default=True, db_index=True)
     join_date = models.DateTimeField(auto_now=True)
     league_manager = models.BooleanField(default=False, db_index=True)

     def __unicode__(self):
         return "%s (%s)" % (self.member, self.group)

现在我可以获得Membership类的句柄,就像之前一样,创建了关系,但是没有明确的对象供我使用。谢谢大家。