Django 查询在没有主键或外键的情况下连接来自两个模型的数据

Django query to join data from two models without primary or foreign key

我正在学习 Django,到目前为止还不错,但是我被 get_query(self) 函数卡住了。

我在 django 中有两个模型 tables:

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()

现在我想创建一个列表视图,但我想加入 table 字段 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中引用另一个模型?

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

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 %}