如何删除数据库中的重复项

2024-09-29 02:20:39 发布

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

问题是所有字段都会重复,我只想为所有产品实现一个字段。我试过使用.distinct(),它不起作用。你可以看到照片; enter image description here

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

Tags: texttruesizestyleaddressmodelsmyorder
1条回答
网友
1楼 · 发布于 2024-09-29 02:20:39

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

问题是你认为什么是复制品。您可以在values上使用distinct。例如,如果您只希望每个用户和帐单地址有一个不同的行,您可以这样做

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

结果将是一个包含dicts的查询集,其中有两个键:“billing\u address”和“user”,dict的值是BillingAddressUser对象的pk。你知道吗

因为您可能需要模板中的实际值而不是pks,所以将上面的查询与loopups结合起来

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

正如在docs中提到的,对此有一些警告。这里还提到,在PostgreSQL上,只有您可以将字段作为参数直接添加到distinct(),但我既没有尝试过,也没有提到您的数据库

相关问题 更多 >