Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';无法获得Django Manytomy模型对象的句柄_Python_Django - Fatal编程技术网

Python Can';无法获得Django Manytomy模型对象的句柄

Python Can';无法获得Django Manytomy模型对象的句柄,python,django,Python,Django,我有一个简单的成员示例和Django应用程序中的MemberGroup类。我想要以下数据表示形式,但我不确定使用多个关系是否会使事情复杂化: 成员: 1-成员1 2-成员2 3-成员3 组: 1-第1组 2-第2组 3-第3组 成员组: 1-成员1/组1 2-成员1/组2 3-成员2/组3等 我有以下课程: class Member(models.Model): nickname = models.CharField(max_length=30, blank=False) pai

我有一个简单的成员示例和Django应用程序中的MemberGroup类。我想要以下数据表示形式,但我不确定使用多个关系是否会使事情复杂化:

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

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

成员组:
1-成员1/组1
2-成员1/组2
3-成员2/组3等

我有以下课程:

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>


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

首先,我会这样做:

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)
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)
然后你可以这样做:

>>> 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>]
>>test\u group=group(group\u name='Admin',description='Admin group')
>>>测试组。保存()
>>>m1=成员(昵称为“罗伯特”)
>>>m1.save()
>>>m1.组。添加(测试组)
>>>m1.save()
>>>m1.groups.all()
[]
>>>test_group.objects.get(group_name='Admin').member_set.all()
[]
该代码创建一个组“Admin”,然后创建一个成员“Robert”。它将“Robert”用户与“Admin”组关联。然后,我可以使用
member\u set
返回“Admin”组的所有成员


编辑:将
ManyToMany
字段放在
模型中以引用成员并没有什么错误,但(无论如何,对我来说)似乎是这样的将成员与组相关联比将组与成员相关联更符合逻辑。

因此,再次阅读与多对多关系相关的文档为我提供了正确的解决方案,即在模型上使用此“通过”名称。我的模型现在如下所示:

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)
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类的句柄,其中与以前一样,创建了关系,但没有显式对象供我使用。谢谢大家。

首先,我将MemberGroup模型重命名为Groups,将MemberGroup.member重命名为MemberGroup.members。但这只是为了可读性。接下来,我想您尝试打印Group.members,that为您提供了一个ManyRelatedManager对象。请尝试打印Group.get(pk=1).members.all()。这将返回一个包含组1中所有成员的列表。阅读文档:Group=models.ManyToManyField(Group,related\u name=“members”)中的User-related\u-name以获得更多可读性。因此,您可以执行
Group.members.all()