繁体   English   中英

Django MySql,外键查询

[英]Django MySql, foreign key query

我在Django中有以下模型。

from django.db import models

#Show DB Table Model

class Shows(models.Model):
    show_key = models.CharField(primary_key=True, max_length=7)
    show_date = models.DateField(blank=True, null=True)
    show_venue = models.CharField(max_length=50, blank=True, null=True)
    show_city = models.CharField(max_length=50, blank=True, null=True)
    show_state = models.CharField(max_length=3, blank=True, null=True)
    show_country = models.CharField(max_length=3, blank=True, null=True)

class Meta:
    managed = False
    db_table = 'shows'

#Songs DB Table Model

class Songs(models.Model):
    song_key = models.CharField(primary_key=True, max_length=8)
    show_key = models.ForeignKey('Shows', models.DO_NOTHING, db_column='show_key', blank=True, null=True)
    song_name = models.CharField(max_length=100, blank=True, null=True)
    song_set = models.CharField(max_length=20, blank=True, null=True)
    song_track = models.IntegerField(blank=True, null=True)
    song_encore = models.IntegerField(blank=True, null=True)
    song_segue = models.CharField(max_length=1, blank=True, null=True)
    song_notes = models.CharField(max_length=100, blank=True, null=True)
    song_cover = models.CharField(max_length=50, blank=True, null=True)
    song_with_guest = models.CharField(max_length=50, blank=True, null=True)



class Meta:
    managed = False
    db_table = 'songs'

我正在尝试进行查询,以找到满足特定条件的所有对象,即:

Shows.objects.filter(show_date__year=2000)

以上查询将返回多个对象。

我需要更进一步,并从Songs表/模型中提取与已过滤的Show对象有关的所有信息。 在“ show_key”是主键/外键关系并且是一对多的意义上,模型是相关的。

我还需要将所有找到的数据打包成一个可用的形式,以进行迭代并发送到jinja2模板。

例如:

{% for item in query_results %}
<ul>
    <li>item.show_date</li>
    <li>item.show_venue</li>
    <li>item.show_city</li>
    <li>item.show_state</li>
    <li>item.show_country</li>
</ul>
    <ul>
    {% for song in item %}
        <li>song.song_name</li>
        <li>song.song_set</li>
        <li>song.song_track</li>
        <li>song.song_encore</li>
        <li>song.song_segue</li>
        <li>song.song_notes</li>
    </ul>
    {% endfor %}

提前致谢。 布伦特

好像您要尝试的是向后遵循FK关系

这是模板中的样子:

{% for show in query_results %}
<ul>
    <li>show.show_date</li>
    <li>show.show_venue</li>
    <li>show.show_city</li>
    <li>show.show_state</li>
    <li>show.show_country</li>
</ul>
    <ul>
    {% for song in show.entry_set.all %}
        <li>song.song_name</li>
        <li>song.song_set</li>
        <li>song.song_track</li>
        <li>song.song_encore</li>
        <li>song.song_segue</li>
        <li>song.song_notes</li>
    </ul>
   {% endfor %}

实际上,这将迫使jango为每个节目发出一个SQL查询。 如果您太多,可能会很痛苦。 为了避免这种情况,您可以告诉Django在查询节目时选择相关的歌曲数据。 这样可以节省大量SQL查询。

Shows.objects.select_related(Songs).filter(show_date__year=2000)

我终于想通了!

首先,我查询了Shows模型/表并将结果保存到query_results:

query_results = Shows.objects.filter(show_date__year=2018)

然后在我的Jinja模板中

{% for show in query_results %}
<ul>
    <li>{{show.show_date}}</li>
    <li>{{show.show_venue}}</li>
    <li>{{show.show_city}}</li>
    <li>{{show.show_state}}</li>
    <li>{{show.show_country}}</li>
</ul>
    <ul>
    {% for song in show.songs_set.all %}  #This is the key, calling the related "shows_set.all" This grabs the related objects from the Songs table/model
        <li>{{song.song_name}}</li>
        <li>{{song.song_set}}</li>
        <li>{{song.song_track}}</li>
        <li>{{song.song_encore}}</li>
        <li>{{song.song_segue}}</li>
        <li>{{song.song_notes}}</li>
    {% endfor %}
    </ul>
{% endfor %}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM