【问题标题】:Django complex QuerySet ManyToManyField with other ManyToManyFieldDjango 复杂的 QuerySet ManyToManyField 与其他 ManyToManyField
【发布时间】:2019-08-10 06:09:41
【问题描述】:

对不起这个标题,我不知道如何正确命名它。我在获取与其他 ManyToManyField 相关的 ManyToManyField 查询集时遇到问题。所以看起来像这样,模型 Company 有 ManyToManyField 和 Person,Person 模型有 ManyToManyField 和 Position,因为它背后的逻辑是 1 公司可以有很多人,1 人可以有很少的职位,可以被少数公司雇用(我认为这很清楚)。我通过这种方式获取公司人员的查询集

{% for team in brand.team.all %}
<p>{{ team.first_name }} {{ team.last_name }}</p>

<img class="img-thumbnail" src="/media/{{ team.photo }}">
<p>{{ team.position }} </p>
<p>{{ team.about }} </p>
{% endfor %}

我得到了我想要的,将它与模板进行比较看起来像这样

但我没有得到人的职位,只有company.Position.None,我不知道如何得到这个。从到目前为止的文档中,我知道它适用于单个 ManyToManyField,但我找不到类似于我的案例的示例,我不确定我应该如何获得(人的职位)

以下是我的文件

模型.py

from django.db import models
...

TYPES = (
        ('Startup', 'Startup'),
        ... )

CITIES = (
         ('Warszawa', 'Warszawa'),
         ... )

STACK = (
        ('PHP', 'PHP'),
        ... )

STUDENTS = (
		('No', 'No'),
		('Yes', 'Yes')
	)
STACK_ICONS = (
        ('/static/icons/stack/php.png', 'PHP'),
        ('/static/icons/stack/javascript.png', 'JavaScript'),
        ...
    )

POSITIONS = (
        ('CEO', 'Chief Executive Officer'),
        ('CTO', 'Chief Technology Officer'),
        ...
    )

# object position with relationship many to many to person

class Position(models.Model):
    position = models.CharField(max_length=50, choices=POSITIONS)

    def __str__(self):
        return self.position

# object person relation many to one (many persons to one company)

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    about = models.TextField(max_length=500, default=None)
    position = models.ManyToManyField('Position')
    photo = models.ImageField(blank=True, null=True, default=None)

    def __str__(self):
        return "%s %s" % (self.first_name, self.last_name)

# object company

class Company(models.Model):
    # field person with relation many to one (many persons to 1 company)
    team = models.ManyToManyField('Person')
    name = models.CharField(max_length=100, blank=False)
    technologies = models.ManyToManyField('Stack')
    website = models.TextField(max_length=150, blank=True, null=True, validators=[URLValidator()])
    ...

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Company, self).save(*args, **kwargs)

    def publish(self):
        self.published_date = timezone.now()
        self.save()
        
    def __str__(self):
        return self.name

# object stack relation manytomany with Company

class Stack(models.Model):
    name = models.CharField(max_length=30, choices=STACK)
    icon = models.CharField(max_length=80, choices=STACK_ICONS)

    def __str__(self):
        return self.name

views.py

from django.shortcuts import render, get_object_or_404, redirect
...

def brands(request, slug):
    brand = get_object_or_404(Company, slug=slug)
    return render(request, 'company/comp_view.html', {'brand': brand})

def stacks(request):
    stack = get_object_or_404(Stack)
    return render(request, 'company/comp_view.html', {'stack': stack})

def positions(request):
    position = get_object_or_404(Position)
    return render(request, 'company/comp_view.html', {'position': position})

...

comp_view.html

{% extends 'company/base.html' %}

    <div class="col col-md-1"></div>
    <div class="col col-md-5 card-section">
        <div class="team ">
            <div class="card-title">
                <span>Team</span>
            </div>
            <div class="row text-center">
                <div class="col col-md-4">
                    {% for team in brand.team.all %}
                    <p>{{ team.first_name }} {{ team.last_name }}</p>                        
                    <img class="img-thumbnail" src="/media/{{ team.photo }}">
                    <p>{{ team.position }}</p>
                    <p>{{ team.about }} </p>
                </div>
                {% endfor %}
            </div>
        </div>

{% endblock %}

【问题讨论】:

    标签: django many-to-many django-orm


    【解决方案1】:

    没有“单一的ManyToManyField”这样的东西。您有一个 m2m 关系,您需要像为团队成员一样迭代它。

    {% for position in team.position.all %}
      {{ position.name }}
    {% endfor %}
    

    【讨论】:

    • 嗨,它没有给出任何结果,因为你已经写了 {{ position.name }} 但是模型 Position 只有字段位置,所以当我现在将它更改为 {{ position.position }}作品。不管怎样,谢谢你 ! :D
    • 嗨,我可以再问你@Daniel 1 件事吗?
    • 打开一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2020-02-01
    • 2019-02-06
    • 2012-03-15
    • 2020-07-03
    • 2013-06-12
    • 2010-11-26
    相关资源
    最近更新 更多