• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pobranie konkretnego obiektu z danego modelu

Object Storage Arubacloud
0 głosów
107 wizyt
pytanie zadane 23 września 2019 w Python przez Dawid89 Obywatel (1,100 p.)

Cześć, 

Nie za bardzo rozumiem jak pobrać konkretny obiekt z bazy a następnie wyświetlić gdzieś w kodzie. Próbuję tak:

site_identity = SiteIdentity.objects.filter(pk=1)

lub

site_identity = SiteIdentity.objects.get(pk=1)

ale nie wiem czy poprawnie pobieram wyżej ten obiekt, dalej mam model:

class SiteIdentity(models.Model):
    site_url = models.CharField('header', max_length=200)

i gdzieś w .html chciałbym:

<h2>{{site_identity.site_url}}</h2>

 

1 odpowiedź

0 głosów
odpowiedź 23 września 2019 przez adrian17 Ekspert (344,860 p.)
site_identity = SiteIdentity.objects.filter(pk=1)

To zwraca QuerySet z obiektami, w których pk==1 (czyli w praktyce zbiór z jednym obiektem). Żeby wydobyć z tego zbioru jedyny obiekt, trzeba dodać na koniec .get().

site_identity = SiteIdentity.objects.get(pk=1)

A to jest ładniejsze i robi dokładnie to co chcesz.

a następnie wyświetlić gdzieś w kodzie

W sensie w templacie HTML. A przekazujesz to przy renderowaniu template'u? Możesz pokazać resztę kodu?

komentarz 23 września 2019 przez Dawid89 Obywatel (1,100 p.)

Tak, renderuje:

site_identity = SiteIdentity.objects.filter(pk=1)

def index(request, *args, **kwargs):
    return render(request, 'home.html', {' 'site_identity':site_identity})

Z obiektu ma korzystać kilka modeli dlatego nie ma go wewnątrz funkcji (chyba, że to złe rozwiązanie). 

Z tego co czytałem to z .get() jest ten problem, że jeżeli nie ma jeszcze żadnego utworzonego obiektu to dostajemy error i właśnie u mnie tak jest. A ja chciałbym aby strona działała normalnie, wtedy wchodzę w admina i tam dopiero ustawiam co potrzebuję w tym modelu. 

Znalazłem jeszcze takie rozwiązanie: 

site_seo_tools = SiteSeoTools.objects.all().first()

Ogólnie chciałem mieć tylko jeden obiekt ale nie wiem czy jest w ogóle opcja aby to zrobić.

komentarz 23 września 2019 przez adrian17 Ekspert (344,860 p.)

Z obiektu ma korzystać kilka modeli dlatego nie ma go wewnątrz funkcji (chyba, że to złe rozwiązanie). 

To złe rozwiązanie, między innymi dlatego:

Z tego co czytałem to z .get() jest ten problem, że jeżeli nie ma jeszcze żadnego utworzonego obiektu to dostajemy error i właśnie u mnie tak jest.

;)

Nie rób zapytań bazodanowych poza funkcjami.

Ogólnie chciałem mieć tylko jeden obiekt ale nie wiem czy jest w ogóle opcja aby to zrobić.

To robi .get().

Ale...

A ja chciałbym aby strona działała normalnie, wtedy wchodzę w admina i tam dopiero ustawiam co potrzebuję w tym modelu. 

Czyli możliwe jest że obiektów jest 0, a nie zawsze 1 - no to nie używasz get() tylko najpierw sprawdzasz czy QuerySet jest pusty i jakoś to obsługujesz (albo robisz .get() i łapiesz wyjątek.)

komentarz 23 września 2019 przez Dawid89 Obywatel (1,100 p.)

W takim razie jak rozwiązać dostęp do obiektu dla wielu widoków? 

 

Czyli możliwe jest że obiektów jest 0 - no to nie używasz get() tylko najpierw sprawdzasz czy QuerySet jest pusty (albo robisz .get() i łapiesz wyjątek.)

Obiekt jest. Pomęcze się jeszcze z tym i najwyżej odezwe znowu tutaj. 

komentarz 23 września 2019 przez adrian17 Ekspert (344,860 p.)

W takim razie jak rozwiązać dostęp do obiektu dla wielu widoków? 

Po prostu

def index(request, *args, **kwargs):
    # dla uproszczenia zakladam ze zawsze jest
    site_identity = SiteIdentity.objects.get()
    return render(request, 'home.html', {'site_identity':site_identity})

 

Podobne pytania

0 głosów
0 odpowiedzi 108 wizyt
pytanie zadane 9 stycznia 2020 w Python przez Dawid89 Obywatel (1,100 p.)
0 głosów
1 odpowiedź 646 wizyt
0 głosów
0 odpowiedzi 169 wizyt
pytanie zadane 25 października 2019 w Python przez Dawid89 Obywatel (1,100 p.)

92,551 zapytań

141,399 odpowiedzi

319,529 komentarzy

61,937 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...