Py学习  »  Django

Django模型相互引用

fakeMake • 4 年前 • 1925 次点击  

我有两个模型,我想在我的模板中加入一个if条件,以获得所需的输出。 我有第一个模型

class Subject(models.Model):
    name = models.CharField(max_length=50)
    books = models.ForeignKey('Books')

一秒

class Books(models.Model):
    name = models.CharField(max_length=50)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)

还有风景

def View(request):
    subjects = Subject.objects.all()
    return render('my_html.html",{'subjects':subjects})

在我的模型中,我一直想这样做。

{% for subject in subjects %}
    {% if subject.books.count > 0 %}
        {{ subject.name }}
    {% endif %}
{% endfor %}

我认为唯一的方法是让模型相互参照,以使我的计划发挥作用,但我也认为循环将需要更多的资源。有没有更好的方法通过视图或仅在模型中实现这一点?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132398
文章 [ 1 ]  |  最新文章 4 年前
Willem Van Onsem
Reply   •   1 楼
Willem Van Onsem    4 年前

你只需要 ForeignKey 从…起 Book 到 Subject ,所以:

class Subject(models.Model):
    name = models.CharField(max_length=50)
    # no books

class Books(models.Model):
    name = models.CharField(max_length=50)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)

然后可以过滤主题,使其只检索 主题 至少有一本书:

def view(request):
    subjects = Subject.objects.filter(books__isnull=False).distinct()
    return render(request, 'my_html.html', {'subjects': subjects})

这将是一个好消息 LEFT OUTER JOIN 在桌子上 书 模型,并检查是否至少有一本书。因此,您不需要在模板中进行筛选(这无论如何都不是一个好主意)。