我有一个简单的成员示例,以及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类中的外键以完成我需要的或者我可以使用当前的设置?谢谢你的帮助!
答案 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类的句柄,就像之前一样,创建了关系,但是没有明确的对象供我使用。谢谢大家。