首页 > 解决方案 > 如何删除数据库中的重复项

问题描述

问题是所有字段都重复了,我想按顺序为所有产品实现一个字段。我尝试使用 .distinct(),它不起作用。你可以看到照片; 在此处输入图像描述

class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    items = models.ManyToManyField(OrderItem)
    start_date = models.DateTimeField(auto_now_add=True)
    ordered_date = models.DateTimeField()
    ordered = models.BooleanField(default=False)
    billing_address = models.ForeignKey('BillingAddress', on_delete=models.SET_NULL, blank=True, null=True)
    payment = models.ForeignKey('Payment', on_delete=models.SET_NULL, blank=True, null=True, related_name='payment_opt')

    def __str__(self):
        return self.user.username


def orders(request):
    order = Order.objects.filter(user=request.user.id, ordered=True).distinct()
    context = {
        'order': order,
    }
    return render(request, 'orders.html', context)


{% for order in order %}
<p class="text-muted my-2" style="font-size:14px">
Address: {{ order.billing_address.street_address|capfirst }}</p>
<p class="text-muted my-2" style="font-size:14px"> 
Apartment Address: {{ order.billing_address.apartment_address|capfirst }}</p>
<p class="text-muted my-2" style="font-size:14px"> City: {{ order.billing_address.city|capfirst }} 
</p>
<p class="text-muted my-2" style="font-size:14px"> State: {{ order.billing_address.state|capfirst }} 
</p>
<p class="text-muted" style="font-size:14px"> 
Country: {{ order.billing_address.country.name|capfirst }}</p>
{% endfor %}

标签: pythondjango

解决方案


正如 Willem 正确指出的那样,在像您这样查询单个模型时,通常不可能有真正的重复。所以 distinct() 不会改变查询中的任何内容,因为所有对象都是不同的(由于 pk)

问题是你认为什么是重复的。你可以做的是使用distincton values。例如,如果您只希望每个用户和帐单地址有一条不同的线路,您可以这样做

result = Order.objects.values('billing_address', 'user').distinct()

结果将是一个包含dicts两个键的查询集:“billing_address”和“user”,dict 的值是pkandBillingAddress对象User

因为您可能需要实际值而不是模板中的 pks 将上面的查询与这样的循环结合起来

result = Order.objects.values('billing_address__street_address', 'billing_address__apartment_address', 'user').distinct()

如文档中所述,对此有一些警告。那里还提到,只有在 PostgreSQL 上,您才能将字段作为参数直接添加到,distinct()但我既没有尝试过,也没有提到您的数据库


推荐阅读