我使用的是distinct()对吗?

时间:2018-10-02 14:37:12

标签: django django-models django-queryset

我正在尝试创建一个简单的应用程序以显示数据库记录列表。所述数据通过csvimport从csv批量加载。我正在加载的csv文件具有数千条记录,但是对于此测试,只有一列(municipio,它表示 city ),所有这些列都具有相同的值。

在我用于测试的索引视图中,我想显示已加载(不同)城市的数量,然后显示所述城市的列表。

这是我的观点。py

def index(request):

    num_municipios = DireccionEnCobertura.objects.values_list('municipio').distinct().count()
    municipios = DireccionEnCobertura.objects.values('municipio').distinct()
    return (render (request, 'index.html', context={'num_municipios':num_municipios, 'municipios':municipios}))

这是在我的index.html中

<ul>
    <li><strong>Municipios:</strong> {{ num_municipios }}</li>

  </ul>
  <table>
    <thead>
      <td>Municipios Incluidos</td>
    </thead>
    <tbody>
      {% for municipio in municipios.distinct() %}
      <tr>
          <td>{{ municipio.municipio }}</td>
      </tr>
      {% endfor %}
    </tbody>
  </table>

这是模型

class DireccionEnCobertura(models.Model):
    gescal17 = models.CharField(max_length=17, help_text="")
    municipio = models.CharField(max_length=50, help_text="")
    tipo_via = models.CharField(max_length=50, help_text="")
    nombre_via = models.CharField(max_length=200, help_text="")
    numero = models.CharField( max_length=5, help_text="", null=True)
    cod_postal = models.CharField( max_length=5, help_text="")
    uuii = models.CharField( max_length=5, help_text="", null=True)

    class Meta:
        ordering = ["tipo_via", "nombre_via", "numero"]



    def __str__(self):
        return self.municipio + " " + self.tipo_via + " " + self.nombre_via + " " + str( self.numero )

    def googleMapsLink(self):
        link = "https://www.google.com/maps/search/?api=1&query="
        return link  + self.tipo_via.replace(" ", "%20") + "%20" + self.nombre_via.replace(" ", "%20") + "%2C" + str( self.numero ) + "%2C" + self.cod_postal + "%2C" +  self.municipio

为清楚起见,“市政”字段是我称为“城市”的字段。

我已经上下检查了csv文件,已经将值从第一个单元格复制到了列的其余部分,以确保没有隐藏的字符使其与众不同,但是我仍然得到< / p>

  

num_municipios = 1

(正确),但是

  

在慕尼黑市中的慕尼黑市

显示成百上千个相同的东西。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

问题是您有默认的ordering。来自the documentation for distinct()

  

如果您使用values()查询来限制所选的列,则任何order_by()(或默认模型排序)中使用的列仍会涉及到,并可能影响结果的唯一性。

由于您不关心为此目的的顺序,因此只需remove the ordering

  

如果您不希望对查询应用任何排序,甚至不希望使用默认排序,请不带任何参数调用order_by()

像这样:

municipios = DireccionEnCobertura.objects.order_by().values('municipio').distinct()