Django按id连接两个查询集?

2024-06-29 00:53:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在发送到视图之前将两个表连接在一起,在视图中使用set会导致100秒的查询,这是非常低效的。在

示例结构sites.models.py在

class SiteData(models.Model):
    location = models.CharField(max_length=50)
    site_type = models.ForeignKey(SiteTypes, verbose_name="Site Type", \
                on_delete=models.PROTECT)
    bgp_as = models.CharField(max_length=6, verbose_name="BGP AS Number")
    opening_date = models.DateField(verbose_name="Site opening date")
    last_hw_refresh_date = models.DateField(verbose_name="Date of latest hardware refresh", \
                           blank=True, null=True)
    is_live = models.BooleanField(default=False, verbose_name="Is this a live site?")

示例结构config.models.py在

^{pr2}$

查询:

site_subnets = SiteSubnets.objects.only('subnet').filter(site_ip=True)
site_data = SiteData.objects.only('location','is_live','bgp_as','postcode','opening_date','live_link_type')

期望结果示例:

Location   | Subnet     | BGP AS
---------------------------------
London     | 10.10.10.0 | 65001
Manchester | 10.10.20.0 | 65002
...

在没有sitesubnet表作为主表的情况下,我不能执行select_相关的操作,因为当我在site data上执行它时,我得到

django.core.exceptions.FieldError: Invalid field name(s) given in select_related: 'site_subnets'. Choices are: site_type

如果我使用SiteSubnet作为主表,如果站点没有SiteSubnet.site\u启动我不会得到网站信息。显示

有没有人知道一种方法可以显示所有数据而不运行n+1查询?在

编辑:

预取也会失败,并出现以下错误:

AttributeError: Cannot find 'site_subnets_set' on SiteData object, 'site_subnets_set' is an invalid parameter to prefetch_related()

我将把数据发送到一个模板,在一个循环中被访问,即

<table>
  <tr>
    <td>Location</td>
    <td>Subnet</td>
    <td>BGP AS</td>  
  <tr>
{%for site in sitedata %}
  <tr>
    <td>{{ site.location }}</td>
    <td>{{ site.subnet }}</td>
    <td>{{ site.bg_as }}</td>  
  <tr>
{% endfor %}

谢谢


Tags: namelive示例verbosedatemodelsastype