Как избежать дубликатов при предварительной выборке m2m связанных объектов с мягкими удаляемыми моделями?
Я хочу получить список счетов с не удаленными отношениями.
Модели
class User(models.Model):
accounts = models.ManyToManyField(
to='billing.Account',
through='custom_auth.UserAccount',
through_fields=('user', 'account'),
related_name='users',
)
deleted = models.DateTimeField(
verbose_name=_('Deleted at'),
blank=True,
null=True,
db_index=True
)
objects = UserQuerySet.as_manager()
class UserAccount(models.Model):
user = models.ForeignKey(
to='custom_auth.User',
on_delete=models.CASCADE)
account = models.ForeignKey(
to='billing.Account',
blank=True,
null=True,
on_delete=models.CASCADE)
deleted = models.DateTimeField(
verbose_name=_('Deleted at'),
blank=True,
null=True,
db_index=True
)
class Account(models.Model):
_users = models.ManyToManyField('custom_auth.User', blank=True)
User Manager
class UserQuerySet(models.QuerySet):
def prefetch_accounts_for_api(self, request):
accounts_qs = Account.objects.all()
user_account_qs = UserAccount.objects.filter(
user=request.user,
account_id=OuterRef('pk'),
deleted__isnull=True
)[:1]
accounts_qs = accounts_qs.filter(
useraccount=user_account_qs
)
return self.prefetch_related(Prefetch(
'accounts',
queryset=accounts_qs,
to_attr='enabled_accounts'
))
Проблема заключается в том, что когда в таблице useraccount есть две строки (1 удаленная и 1 не удаленная) и я выполняю запрос:
User.objects.all().prefetch_accounts_for_api(request)
Пользователь имеет дубликат не удаленной учетной записи в атрибуте enabled_accounts.
Как я могу получить только один реальный счет в enabled_accounts?
Использование PostgreSQL и Django 3.1.7