访问Django中间模型组中的字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问Django中间模型组中的字段相关的知识,希望对你有一定的参考价值。

我正在创建一个包含Person和Membership的Group模型,所有这些都在Django docs中描述。

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.朋友:

@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.

其中达米安是request.user的名字

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

有人知道怎么修这个东西吗?

答案

这样做,

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

要么

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

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

以上是关于访问Django中间模型组中的字段的主要内容,如果未能解决你的问题,请参考以下文章

Django REST框架--认证和权限

如何通过 django 中的父表访问中间表字段?

从与模板中的 django 用户关联的模型中访问字段

对中间模型 django 的一个字段进行注释

django模型系统--多对多,一对一以及跨表查询

Django自定义模型(model)中的字段标签