объединение 2 Django QuerySets с использованием OR (|) дублирует элемент из одного из наборов - PullRequest
0 голосов
/ 15 апреля 2020

Я создаю объединение QuerySets, и что-то не складывается. По какой-то причине один элемент дублируется.

Я печатаю: print(len(one), len(two), len(one | two), len((one | two).distinct()))

Я получаю: 8 42 51 50

Как это возможно!?

УТОЧНЕНИЕ:

Я фильтрую сделки, совершенные моей компанией, в которых участвовал один сотрудник.

Я извлекаю из базы данных большой набор сделок, затем получаю два подмножества и объединяю их с ИЛИ (|). Я распечатал весь начальный набор и результат слияния, чтобы проверить, не ошибся ли я при фильтрации набора. Произошло следующее: во всем наборе было 50 сделок, в которых участвовал сотрудник, 8 в одном подмножестве, 42 во втором, но слияние обоих наборов имело 51 печатный идентификатор, показывающий, что один предмет дублировался.

class Users(AbstractBaseUser):
    ...
    email = models.EmailField(max_length=254, unique=True)
    def __str__(self):
        return self.email

class Dealrooms(models.Model):
    ...
    lead_employee = models.ForeignKey(null=True, related_name='dealroom_lead', to=Users)
    supporting_employees = models.ManyToManyField(Users, related_name='dealroom_supporting')

class Deals(models.Model):
    ...
    dealroom = models.OneToOneField(Dealrooms, related_name='deal', null=True)


our_deals = Deals.objects.exclude(...).exclude(...).exclude(...)
one = our_deals.filter(dealroom__lead_employee=user)
two = our_deals.filter(dealroom__supporting_employees__email=user)
print(len(one), len(two), len(one | two), len((one | two).distinct()))

Печатные результаты: 8 42 51 50

У меня нет большого опыта с Python и еще меньше с Django. Я не знаю, как это работает под поверхностью, но математика просто неверна. Я фактически отбросил всю часть кода и извлекаю информацию, которая мне нужна, другим способом, но я все еще хочу понять, что произошло. Как это возможно.

...