【问题标题】:Access fields in Django intermediate model of Groups组的 Django 中间模型中的访问字段
【发布时间】:2016-06-23 05:49:26
【问题描述】:

我正在创建一个包含人员和成员资格的组模型,所有这些都在 Django 文档中进行了描述。

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):              
        return self.name


class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

    def __str__(self):              
        return self.name


class Membership(models.Model):
    person = models.ForeignKey(Person)
    leader = models.BooleanField(default=False)
    group = models.ForeignKey(Group)

我只是在视图中制作这一切,因为我想将此“创建组”作为我的网络应用程序中的一项功能。

views.py:

@login_required
def groups(request):
user = request.user

if request.method == "POST":
    form = GroupForm(request.POST)
    if form.is_valid():
        formm = form.save(commit=False)

        g = Group.objects.create(name = formm.name)
        p = Person.objects.create(name=request.user)
        m = Membership.objects.create(person=p, group=g, leader=True)



        gr = Group.objects.all()
        per = Person.objects.all()
        mem = Membership.objects.all()
        context = {
        'gr': gr,
        'per':per,
        'mem':mem,
        'form': form,
        }
        return render(request, 'groups.html', context )

else:

    gr = Group.objects.all()
    per = Person.objects.all()
    mem = Membership.objects.all()
    form = GroupForm()

    context = {
        'gr': gr,
        'per':per,
        'mem':mem,
        'form': form,
    }

    return render(request, 'groups.html', context)

groups.html:

{% block profile %}
  <div class="jumbotron">
    <h4>Create a new group here:</h4>
    <form method="POST" class="post-form">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="save btn btn-default">Go!</button>
    </form>
  </div>


        {% for m in mem %}
        <div class="jumbotron">
          <br>
            <p><b>Name of group:</b> {{ m.group }} </p> 
            <p><b>Member:</b> {{ m.person }} </p>
          <br>
        </div>
        {% endfor %}



{% endblock %}

问题是我什么时候想用

Membership.objects.filter(person=request.user) 

并得到错误:

ValueError at /groups/
Cannot query "damian": Must be "Person" instance.

其中 damian 是 request.user 的名称

我只是想过滤这个以仅在模板中显示选择的成员资格、组等...

有人知道如何解决这个问题吗?

【问题讨论】:

  • 您能否编辑您的问题以向我们展示完整的堆栈跟踪?

标签: python django model many-to-many


【解决方案1】:

这样做,

Membership.objects.filter(person__name=request.user)

p = Person.objects.get(name=request.user)
Membership.objects.filter(person=p)

您必须在Membership 过滤查询中将Person 类实例传递给person 参数。

【讨论】:

  • 酷,它有效!非常感谢! :) 我会记住这条规则。但我想知道这是来自 clear python 还是 django 的规则?我是初学者,还在学习:)
  • 还有...更有趣的是,我有这样的代码,例如:{% for g in gr %}

    Name: {{ g.name }} {{g.members}}

    {% endfor %} 并且想知道为什么 {{g.name}} 显示正确,但是当我想查看 {{g.members}} 的显示结果时,它就像: 'proj.Person.None'。不知道为什么,它只给我指明了方向......
  • members 是 Group 模型类中的属性吗?您只能通过点运算符访问类属性。最好添加Group Model 类代码。
  • 什么意思?我有这个属性,你可以在我的代码中看到。但是当我创建 Group 对象时,我只设置了一个名称,没有任何其他名称。你能告诉我你的意思吗?这应该会有所帮助
猜你喜欢
  • 2011-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 2014-10-21
  • 1970-01-01
  • 2011-06-06
相关资源
最近更新 更多