Relationships “backward” Python Django

0

Cześć,
tworzę prostą aplikację TODO. Ma ona polegać na tym że każdy user po zalogowaniu się ma swoja listę zadań i każda z tych list ma swoje zadania.
Przykład:
Wtorek:(to jest LISTA ZADAŃ, a poniżej są zadania)

  • posprzątaj pokój
  • umyj auto
  • przeczytaj książkę

Środa:

  • idz na uczelnie
  • idź do fryzjera

Mam problem ponieważ chce uzyskać dostęp do zadań z LISTY ZADAŃ zalogowanego usera.
Przykład:
Jestem zalogowany jako Paweł mam dwie Listy zadań "Wtorek" i "Środa" i chciałbym zobaczyć co w każdej z tej listy są za zadania.

Podsyłam modele i kod do gita gdyby ktoś chciał zajrzeć do całości. W kodzie jest dużo namącone ponieważ próbuje sobie wszystkiego po kolei.
https://gitlab.com/pawroz/my-own-todo-app

class TaskList(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    title = models.CharField(max_length=40)
    create_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title


class Task(models.Model):
    #user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    task_list = models.ForeignKey(TaskList, on_delete=models.CASCADE, null=True, blank=True)
    title = models.CharField(max_length=40)
    description = models.TextField(max_length=200, null=True, blank=True)
    complete = models.BooleanField(default=False)
    created_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title
0
TaskList= TaskList.objects.filter(user=request.user)

for task in tasklist.task_set.all()
1

@Rado: Niestety nie działa. Screen poniżej
screenshot-20220111191550.png

2

o_O to są żarty jakieś? Przecież widzisz chyba ze twoja klasa Task ma pole task_list a nie żadne task_set. Mam spore wątpliwości co do tego czy napisałeś tam chociaż jedna linijkę sam.

1

@Shalom: Okej, to miej spore wątpliwości. Najwazniejsze że ja wiem i z czystym sumieniem moge powiedzieć, że napisałem wszystko sam.
Co z tego ze ma pole task_list? Chce dostać wszystkie Taski, które są w konkretnych TaskListach podpiętych pod zalogowanego usera.
screenshot-20220111193728.png

3

@GoT98wppl kajam się, nie doczytałem dokładnie co robisz :( Teraz rozumiem co chcesz zrobić. O ile dobrze rozumiem to nie możesz zrobić tak jak próbujesz, bo masz w ręku QuerySet (bo zrobiłeś filtracje ale nadal masz potencjalnie X obiektów wybranych) a do tego odwołania przez _set potrzebujesz jeden obiekt. Bardzo możliwe że musisz przeiterować po tym co trzymasz jako tasklist (ale ze to jakiś QuerySet to moze trzeba coś na tym jeszcze zawołać)

0

tutaj z usera wyciagasz liste zadan

task_list = request.user.tasklist_set.filter(id=TUTAJ_ID).first()

tutaj z listy zadan wyciagasz zadania

tasks = task_list.task_set.all()

zamiast all mozesz sobie filtrowac na rozne sposoby

2

Zamiast filter daj tam get jeśli chcesz tylko jeden po np ID i powinno być ok daj jeszcze makemigrations i migrate Shaklom dobrze pisze tylko trzeba by machając tak jak wcześniej ale dodać jeszcze jednego for

For x  in TaskList:
   For task in x.task_set.all()
0

Dzięki wszystkim za komentarze i zaangażowanie!

tasklist = TaskList.objects.filter(user=request.user)
for i in tasklist:
    print(i.task_set.all())
1

@Rado: Pobieranie tasków w pętli jest skrajnie nieoptymalne pod względem liczby uderzeń do bazy.
@GoT98wppl coś takiego na ten moment nie zrobi Ci to krzywdy, ale na przyszłość doczytaj o prefetch_related i select_related

0

@masochista: Cześć, wiem że długo się nie odzywałem, ale czy mógłbyś pokazać na moim przykładzie jak użyć zagadnień, o których napisałeś, aby uzyskać efekt którego oczekuję?

1 użytkowników online, w tym zalogowanych: 0, gości: 1