相互引用的 Django 模型

Django models referencing each other

我有两个模型,我想在我的模板中放置一个 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 %}

我认为唯一的方法是让模型相互引用以使我的计划生效,但我也认为循环将需要更多资源。有没有更好的方法通过视图或仅在模型中执行此操作?

您只需要 ForeignKeyBookSubject,所以:

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

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

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

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

这将在 Book 模型的 table 上创建一个 LEFT OUTER JOIN,并检查是否至少有一本书。因此,您不需要在模板中进行过滤(无论如何这都不是一个好主意)。