【问题标题】:Django query to join data from two models without primary or foreign keyDjango查询以连接来自两个模型的数据,没有主键或外键
【发布时间】:2021-04-08 13:23:21
【问题描述】:

我正在学习 Django,到目前为止一切都很好,但是我坚持使用 get_query(self) 函数。

我在 django 中有两个模型,表格中没有外文:

class Airport(models.Model):
   ID = models.AutoField()
   Name = models.CharField()
   City = models.CharField()
   ICAO = models.CharField()

class Airport_Frequency(models.Model):
   ICAO = models.CharField())
   ATC_Type = models.CharField()
   Frequency_MHz = models.DecimalField()

现在我想创建一个列表视图,但我想加入表字段Airport.nameAirport_Frequency.ICAO 以显示在频率列表中 - SQL 语句:

SELECT DISTINCT a.ICAO, b.ICAO, b.Name FROM airport as b, airport_frequency as a WHERE a.ICAO = b.ICAO

查看:

class Airport_FrequencyListView(ListView):
    model = Airport_Frequency

如何在上面的Airport_FrequencyListViewview 中引用另一个模型?

【问题讨论】:

  • 您应该使用ForeignKey/OneToOneField 将两者链接在一起。

标签: python-3.x django django-models django-queryset


【解决方案1】:

Django 不能使用不属于模型的连接。在您的情况下,一个好的主键可以是 ICAO(机场的唯一四个字母标识符 - 全球唯一)。大型机场需要更多不同频率的频道,因此是一对多的关系。

class Airport(models.Model):
   ICAO = models.CharField(max_length=4, primary_key=True)
   Name = models.CharField(...)
   City = models.CharField(...)

class Airport_Frequency(models.Model):
   airport = models.ForeignKey(Airport)  # Airport_id is the ICAO of the airport
   ATC_Type = models.CharField(...)
   Frequency_MHz = models.DecimalField(...)

views.py

class Airport_FrequencyListView(ListView):
    queryset = Airport_Frequency.objects.select_related('airport')
    ...

模板

{% for item in object_list %}
    {{ item.airport.ICAO }},{{ item.airport.Name }},{{ item.Frequency_MHz }}<br>
{% end for %}

【讨论】:

  • 谢谢,我用了selelect_related
【解决方案2】:
class Airport(models.Model):
   ID = models.AutoField()
   Name = models.CharField()
   City = models.CharField()
   ICAO = models.CharField()

class Airport_Frequency(models.Model):
   airport = models.ForeignKey(Airport, null=True)
   ICAO = models.CharField())
   ATC_Type = models.CharField()
   Frequency_MHz = models.DecimalField()

然后去访问对方的访问权限:

airport.airport_frequency
airport_frequency.airport

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-01
    • 2016-01-14
    • 2015-08-27
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多