Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remove duplicate objects from queryset #1755

Open
wants to merge 4 commits into
base: master-dev
Choose a base branch
from

Conversation

AndrzejMorawski00
Copy link
Collaborator

@AndrzejMorawski00 AndrzejMorawski00 commented Oct 29, 2024

Problem wynikał z dodania do funkcji ThesesQuerySet.visible warunku Q(students__user=user). Ten warunek jest potrzebny, aby wyświetlić pracę dyplomową osobom, które powinny ją zobaczyć, gdy jest ona weryfikowana przez komisję lub została zwrócona do poprawek. Ponieważ pole students w modelu Thesis jest relacją m2m to mamy do czynienia ze złączeniem wielu tabel. W tym momencie otrzymujemy tyle wyników danej pracy dyplomowej ilu jest przypisanych do niej studentów. Aby rozwiązać ten problem usuwamy duplikaty z zapytania dopisując .distinct() do zapytania.

@AndrzejMorawski00
Copy link
Collaborator Author

AndrzejMorawski00 commented Oct 29, 2024 via email

@lgpawel
Copy link
Contributor

lgpawel commented Nov 27, 2024

Ad dlaczego to czasami działało: w instrukcji warunkowej ThesesQuerySet.visible wchodziliśmy do gałęzi, gdzie nie było problematycznego zapytania do bazy, tylko zwykłe return self. Przy okazji przekonałem się, że są jeszcze podstrony, na których efekt (w bieżącym stanie) jest jeszcze gorszy – wyjątek MultipleObjectsReturned, oczywiście niezłapany...

Rozwiązanie wydaje się działać, ale z punktu widzenia pisania zapytań do bazy danych to jest trochę hotfix, zaciemniający (moim zdaniem) naturę zapytania. Jasne, że ostatni obiekt Q dopisany w filtrze jest źle napisany, ale lepiej byłoby napisać go od razu dobrze, żeby sprawdzał, czy bieżący użytkownik jest wśród przypisanych do tematu (a nie równy któremuś z nich). Analogicznie do SQLowego operatora IN [podzapytanie] mamy w Django takie coś https://docs.djangoproject.com/en/3.2/ref/models/querysets/#in choć efekt może nie być jednolinijkowcem...

@AndrzejMorawski00
Copy link
Collaborator Author

AndrzejMorawski00 commented Nov 27, 2024

Poprawiłem zapytanie tak, żeby generowało queryset bez duplikatów w bardziej czytelny sposób.

@lgpawel
Copy link
Contributor

lgpawel commented Nov 30, 2024

Chyba działa i faktycznie jest czytelne. Może jeszcze fajniej byłoby, gdyby pomocniczy obiekt (wtedy lepiej o nazwie np. my_theses) wybierał wszystkie tematy, z którymi związany jest użytkownik (w dowolnej z trzech wiadomych ról) i potem sumowałoby się to (mnogościowo) z tematami "ogólnodostępnymi"? To nie jest pytanie retoryczne.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Błędy wyświetlania listy tematów prac dyplomowych dla studentów i "zwykłych" nauczycieli
2 participants