-
Notifications
You must be signed in to change notification settings - Fork 10
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
base: master-dev
Are you sure you want to change the base?
The head ref may contain hidden characters: "1712-b\u0142\u0119dy-wy\u015Bwietlania-listy-temat\u00F3w-prac-dyplomowych-dla-student\u00F3w-i-zwyk\u0142ych-nauczycieli"
remove duplicate objects from queryset #1755
Conversation
Z tego co zrozumiałem to w tej funkcji mamy taką konstrukcję:
* Jeżeli użytkownik jest członkiem rady lub ma status 'is_staff' to
zwracamy wszystkie prace coś na zasadzie Thesis.objects.all()
* W przeciwnym wypadku sprawdzamy następujące rzeczy:
1. Filtrujemy tylko te prace, które nie są ewaluowane lub nie zostały
zwrócone do poprawek
2. Do tego zbioru dodajemy te prace, które spełniają kolejne warunki.
Na samym końcu warunku sprawdzamy, czy użytkownik może zobaczyć tę pracę a
ponieważ to może być relacja wiele-wiele to będziemy mieli kilka par dla
tej samej pracy np:
Praca -> student1
Praca -> student2
Praca -> student3
I to nam zwraca powtórzenia, które pojawiają się tylko w momencie, gdy do
jednej pracy jest przypisany więcej niż 1 student. Więc wydaje mi się, że
to wynika po prostu ze sposobu w jaki django tworzy zapytania.
wt., 29 paź 2024 o 14:54 Michal Augustyn ***@***.***>
napisał(a):
… Ja chyba dalej nie czaje czemu te zwielokrotnienia prac pokazywały się
jednemu typowi użytkowników, a drugim nie
—
Reply to this email directly, view it on GitHub
<#1755 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AROHVUT7CBVLEQBUHLJ44CTZ56HQ5AVCNFSM6AAAAABQZOPTGGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDINBUGMZTGNZUGA>
.
You are receiving this because you authored the thread.Message ID:
***@***.***>
|
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 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 |
Poprawiłem zapytanie tak, żeby generowało queryset bez duplikatów w bardziej czytelny sposób. |
Chyba działa i faktycznie jest czytelne. Może jeszcze fajniej byłoby, gdyby pomocniczy obiekt (wtedy lepiej o nazwie np. |
Problem wynikał z dodania do funkcji
ThesesQuerySet.visible
warunkuQ(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ż polestudents
w modeluThesis
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.