相互引用的 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 %}
我认为唯一的方法是让模型相互引用以使我的计划生效,但我也认为循环将需要更多资源。有没有更好的方法通过视图或仅在模型中执行此操作?
您只需要 ForeignKey
从 Book
到 Subject
,所以:
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)
然后您可以过滤主题,使其仅检索 Subject
s 至少有一本书:
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
,并检查是否至少有一本书。因此,您不需要在模板中进行过滤(无论如何这都不是一个好主意)。
我有两个模型,我想在我的模板中放置一个 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 %}
我认为唯一的方法是让模型相互引用以使我的计划生效,但我也认为循环将需要更多资源。有没有更好的方法通过视图或仅在模型中执行此操作?
您只需要 ForeignKey
从 Book
到 Subject
,所以:
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)
然后您可以过滤主题,使其仅检索 Subject
s 至少有一本书:
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
,并检查是否至少有一本书。因此,您不需要在模板中进行过滤(无论如何这都不是一个好主意)。