Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
BF extended 2022
Avatar
Marty
Člen
Avatar
Marty:15.6.2020 0:40

Ahoj,

mám vlastní metodu, kterou vracím slepený text a všude funguje jak má, ale u filtrování se mi to nedaří rozchodit.

class Generation(models.Model):
    generation = models.CharField(unique=True, max_length=50)
    is_active = models.BooleanField(default=True)
    history = HistoricalRecords()

    def __str__(self) -> str:
        return self.full_name

    @property
    def full_name(self) -> str:
        return f"Gen {self.generation}"

class GenerationAdmin(SimpleHistoryAdmin):
    list_display = ('full_name', 'is_active')
    list_display_links = ('full_name',)
    search_fields = ('full_name',)

Zkusil jsem: Zkoušel jsem si vytvořit další vlastní metodu, kterou jsem dal místo full_name v search_fields, aby by mi vracela pole, ale ani to nepomohlo, protože při jakémkoli dotazu ve filtru mi to háže chybu Cannot resolve keyword "field_full_name" into field.

def field_full_name(self):
        return [i.full_name for i in Generation.objects.all()]

Nevěděl by někdo, kde je zakopaný pes?
Díky.

 
Odpovědět
15.6.2020 0:40
Avatar
Filip Němeček
Překladatel
Avatar
Filip Němeček:15.6.2020 7:30

Ahoj, nebude problém v tom, že metoda filtr pracuje skrze ORM přímo nad databází a proto nezná tuto custom property?

Jak ten filtr používáš? Nepůjde to udělat přes property generation?

 
Nahoru Odpovědět
15.6.2020 7:30
Avatar
Marty
Člen
Avatar
Odpovídá na Filip Němeček
Marty:16.6.2020 1:28

Toto je veškerý můj kód ohledně třídy Generace.

Jak pracuje metoda filtr nevím, třeba opravdu pracuje s databázovými poli. Pokud je to pravda, jak tedy udělám, aby se filtrovalo to pole generace, ale s tím, aby to našlo například (čistý) objekt "10", i když uživatel zadá text "gen 10"?

 
Nahoru Odpovědět
16.6.2020 1:28
Avatar
Filip Němeček
Překladatel
Avatar
Filip Němeček:16.6.2020 9:12

No ono všechny tyto metody jako filter, order_by a tak právě sahají rovnou do databáze aby to bylo výkonné :-)

Co se týče vyhledávání, tak ty uživatele necháváš psát text nebo je to třeba nějaký drop down? Když uživatel zadá "Generation 10", tak by mu ten předchozí příklad nefungoval. Pak taky otázka, jak může to generation vypadat, když to je charField. Co třeba v tomto případě přes regex vytáhnout číslo a to poslat do filter?

 
Nahoru Odpovědět
16.6.2020 9:12
Avatar
Marty
Člen
Avatar
Odpovídá na Filip Němeček
Marty:16.6.2020 21:27

Tím filtrováním jsem měl na mysli klasický input, kam to uživatel zadá.

Díky za rady. Nakonec jsem se rozhodl, že bude nejjednodušší ten prefix napevno přidat ke všem generation objektům a pak to bude fungovat automaticky.

Ještě na tom s Djangem nejsem tak dobře, abych si troufl na pokročilejší věci. :-)

 
Nahoru Odpovědět
16.6.2020 21:27
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.