Как выбрать отличную от Django модель - PullRequest
0 голосов
/ 06 февраля 2020

Если только переменные address и address_detail одинаковы среди переменных модели, я хочу удалить дубликаты.
Как использовать отдельный адрес, address_detail?

class Information(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    address = models.CharField(max_length=200)
    address_detail = models.CharField(blank=True, max_length=100)
    zipcode = models.CharField(max_length=50)
    email = models.EmailField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

(таблица)
пользователь, мой адрес, мой адрес, 11122, myemail@email.com
пользователь, мой адрес, мой адрес, 12345, test@email.com
пользователь, мой адрес, мой адрес, 22211, example@email.com

(результат)
пользователь, мой адрес, мой адрес, 11122, myemail@email.com

1 Ответ

2 голосов
/ 06 февраля 2020

Используйте distinct(*fields) в вашем QuerySet . Обратите внимание, что это работает только с PostgreSQL.

В качестве альтернативы, если вы не используете PostgreSQL, вы можете сделать это:

from django.db.models import Max

distinct_by_address = Information.objects.values('address', 'address_detail')\
    .annotate(last_pk=Max('pk'))\
    .values('last_pk')
result = Information.objects.filter(pk__in=distinct_by_address)

Это группирует по address и address_detail (так будет возьмите только одну для каждой дублированной комбинации) и выберите последний (самый высокий) pk. Затем мы просто фильтруем объекты на этом ПК, чтобы мы могли показать другие поля.

Однако это менее гибко, потому что вам нужно агрегировать на 'ПК' или другом уникальном поле, которое может быть заказанным и работает с Max или Min.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...