Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako modelovati kategorije proizvoda u Djangu?

[es] :: Python :: Kako modelovati kategorije proizvoda u Djangu?

[ Pregleda: 1570 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

clydefrog

Član broj: 340220
Poruke: 107



+5 Profil

icon Kako modelovati kategorije proizvoda u Djangu?25.09.2019. u 17:31 - pre 54 meseci
Pravim za vežbu web shop gde će se prodavati razne stvari kao što su knjige, odeća, obuća, telefoni, kompjuteri, itd.
Za svaku od tih kategorija mi treba najmanje 2-3 podkategorije, nisam siguran kako modelovati sve to.

Na primer,

Knjige - Udžbenici - Osnovna škola, ili
Obuća - Muška obuća - Cipele
 
Odgovor na temu

mjanjic
Šikagou

Član broj: 187539
Poruke: 2679



+690 Profil

icon Re: Kako modelovati kategorije proizvoda u Djangu?25.09.2019. u 18:33 - pre 54 meseci
Hm, prodavaće se i knjige za školu sa obućom, odećom, telefonima...?

Pogledaj šablone za WooCommerce, Magento, VirtueMart i druga eCommerce rešenja pa sam izvedi zaključak.

Ako ne koristiš neki gotov šablon za prodavnicu, pokušaj da isprogramiraš da ti neka podkategorija ima više parent kategorija (npr. udžbenici mogu da budu podkategorija za kategoriju knjige i za kategoriju škola->knjige, a same knjige mogu da budu i samostalna kategorija (sa podkategorijom udžbenici) i podkategorija knjige za kategoriju škola.

Malo je zeznuto, ali to ne moraju da budu stvarno kategorije kao kod eCommerce rešenja gde je ovo navedeno kod nekih od pomenutih sistema nemoguće izvesti, već možeš na osnovu tag-a ili ključnih reči da formiraš virtuelnu kategoriju (URL tipa: shop/school/books ili shop/school/books ili shop/school/books/primary) koja bi se prikazivala u navigaciji (breadcrumb) i/ili adresnom polju.

Poenta "start from scratch" rešenja je da napraviš nešto što nema u ovim gotovim eCommerce rešenjima, inače možeš da koristiš Oscar ili Saleor (eCommerce), ili bar neki CMS tipa tipa Wagtail.
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
 
Odgovor na temu

clydefrog

Član broj: 340220
Poruke: 107



+5 Profil

icon Re: Kako modelovati kategorije proizvoda u Djangu?25.09.2019. u 19:44 - pre 54 meseci
Da, pravim nešto kao Kupindo.

Ne koristim nikakve šablone jer je poenta svega ovoga učenje, ovo neće biti lansirano i pušteno u promet, u najboljem slučaju ću ga prodati nekome kad završim za fixnu cenu, a ako ne izgledaće dobro u portfoliju kada se budem prijavljivao za posao.

Elem, šta mislite o ovom rešenju:

Code:
from django.db import models

...

class Product(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    price = models.DecimalField(decimal_places=2, max_digits=10)
    year = models.PositiveSmallIntegerField()
    image = models.ImageField(upload_to=get_image_path, blank=True, null=True)
    date_added = models.DateTimeField(auto_now=True, null=True)
    category = models.ForeignKey('Category', on_delete=models.CASCADE)

    def get_absolute_url(self):
        return reverse('products:product-detail', kwargs={'id': self.id})

class Category(models.Model):
    parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name


Code:
>>> from products.models import Category
>>> c = Category(name='Books')
>>> c1 = Category(name='Textbooks', parent=c)
>>> c2 = Category(name='Primary school', parent=c1)
>>> from products.models import Product
>>> p = Product(title='Biologija za 7. razred', description='Biologija za 7. razred osnovne skole', price=200, year=2018, category=c2)
>>> p.category
<Category: Primary school>


Neko mi reče da je problem kada treba uraditi upit da se dohvate sve knjige jer se prvo moraju rekurzivno proći sve podkategorije 'Knjige', i potom dohvatiti sve knjige od tih podkategorija.
 
Odgovor na temu

nkrgovic
Nikola Krgović
Beograd

Član broj: 3534
Poruke: 2807

ICQ: 49345867
Sajt: https://www.twinstarsyste..


+655 Profil

icon Re: Kako modelovati kategorije proizvoda u Djangu?25.09.2019. u 21:18 - pre 54 meseci
OK, radio sam kao, izmedju ostalog, database admin na Kupindu preko pet godina, ajde par saveta:

- Bazu modeliras u alatu za bazu. Ne u programskom jeziku :D . Super su te fore, migracije, i slicno, ali nijedan e-commerce koji ima iole normalnu velicinu baze ne pise migracije, trajale bi predugo. Alter table na nekim tabelama na kupindo bazi je trajao po 3-4 sata, da je to migracija ceo sajt bi ti bio down :).
- Ako ti je za ucenje, prvo vidi kako ces da resis atribute objekata. Toplo ti preporucujem da proucis Entity-Attribute-Value model. To je ono "broj cipela, boja... ".
- Kategorije definisises kao jednu tabelu. Sve ostalo kao drugu tabelu, a onda imas relacije parent-child, svaka potkategorija ima ko joj je parent kategorija u vidu relacije. Menja se to cesto. :) Napravi da mozes da prebacis potkategoriju iz jedne u drugu kategoriju. Trebace ti. :D

Ne ide se "rekurzivno" nije to lista. Ako imas kategoriju knjige i potkategoriju beletristika, ti za svaki entitet (predmet) imas tabelu koja pravi relacije kategorija-predmet (knjige - "rat i mir") i relaciju potkategorije ("beletristika" - "rat i mir"). Ako ti je predmet "rat i mir" ID-a 5521 ti samo trazis sve sto imas u tabeli kredmet_kategorija WHERE IDPredmet=5521 da saznas u kojoj je kategoriji, ili WHERE ID_kategorjia=11 ako je 11 ID kategorije knjige. Ako hoces jednim upitom da sve dohvatis, imas za to JOIN, koji mozes da podrzis i nekim indexom...

Nisam naravno sacuvao strukturu baze i ne smem ni da komentarise ono sto je poslovna tajna, ali EAV model koriste svi veliki ecommerce sajtovi.

Ako hoces da pravis ecommerce projekat dobro nauci relacione baze. Sad mi je zao sto mysql.rs vise ne radi, imao je Bogi tamo fantazija tekstove o normalnim formama i dizajnu baza. :) U svakom slucaju, guglas "normane forme", guglas "Entity-Attribute-Value" pa polako.
Please do not feed the Trolls!

Blasphemy? How can I blaspheme? I'm a god!'
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Kako modelovati kategorije proizvoda u Djangu?25.09.2019. u 21:30 - pre 54 meseci
Citat:
nkrgovic: Sad mi je zao sto mysql.rs vise ne radi, imao je Bogi tamo fantazija tekstove o normalnim formama i dizajnu baza. :)

https://web.archive.org/web/20180311083727/http://www.mysql.rs/
 
Odgovor na temu

clydefrog

Član broj: 340220
Poruke: 107



+5 Profil

icon Re: Kako modelovati kategorije proizvoda u Djangu?25.09.2019. u 22:30 - pre 54 meseci
@nkrgovic,

Citat:
Bazu modeliras u alatu za bazu. Ne u programskom jeziku :D . Super su te fore, migracije, i slicno, ali nijedan e-commerce koji ima iole normalnu velicinu baze ne pise migracije, trajale bi predugo. Alter table na nekim tabelama na kupindo bazi je trajao po 3-4 sata, da je to migracija ceo sajt bi ti bio down :).


Znači li to da je Django u ovom slučaju promašaj, tj. da se ovaj projekat ne može uraditi koristeći Django?

Hvala što si se javio u svakom slučaju, dobro je čuti savet iz prve ruke.
 
Odgovor na temu

electropioneer

Član broj: 45208
Poruke: 78
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: Kako modelovati kategorije proizvoda u Djangu?25.09.2019. u 23:35 - pre 54 meseci
Ok je Django, samo nastavi.
https://djangopackages.org/grids/g/ecommerce/
 
Odgovor na temu

mjanjic
Šikagou

Član broj: 187539
Poruke: 2679



+690 Profil

icon Re: Kako modelovati kategorije proizvoda u Djangu?25.09.2019. u 23:44 - pre 54 meseci
Koliko sam shvatio, nema veze sa programskim jezikom. Ionako neke stvari moraju da se urade na DB, a programeri kad uče da rade sa podacima iz baze, često nauče ono što im je lakše da urade na primeru male baze sa nekoliko tabela, a to kod velikih baza (kao u slučaju ozbiljnij eCommerce sajtova) ne pije vodu. Ono, može da šljaka, ali uz traćenje hardverskih resursa i raznorazne probleme u funkcionisanju.
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Kako modelovati kategorije proizvoda u Djangu?26.09.2019. u 08:12 - pre 54 meseci
Citat:
Neko mi reče da je problem kada treba uraditi upit da se dohvate sve knjige jer se prvo moraju rekurzivno proći sve podkategorije 'Knjige', i potom dohvatiti sve knjige od tih podkategorija.

Pogledaj select_related() lookup.
Code:

Product.objects.select_related('category').all()
                                                                                                                                
<QuerySet [<Product: Biologija za 7. razred>, <Product: Matematika za 8 razred>,
<Product: Django za pocetnike>, <Product: Python za pocetnike>]>


Field lookups
Code:

Product.objects.filter(category__name='Primary school')                                                                                                                                
<QuerySet [<Product: Biologija za 7. razred>, <Product: Matematika za 8 razred>]>

Product.objects.filter(category__name='Textbooks')                                                                                                                                     
<QuerySet [<Product: Django za pocetnike>]>

Product.objects.filter(category__name='Books')                                                                                                                                         
<QuerySet [<Product: Python za pocetnike>]>


related_name
Code:

category = Category.objects.get(name='Primary school')                                                                                                                                 
category.product_set.all()                                                                                                                                                             
<QuerySet [<Product: Biologija za 7. razred>, <Product: Matematika za 8 razred>]>

# sa related_name 
category = models.ForeignKey('Category', related_name='categories', on_delete=models.CASCADE)

category.categories.all()                                                                                                                                                              
<QuerySet [<Product: Biologija za 7. razred>, <Product: Matematika za 8 razred>]>

 
Odgovor na temu

nkrgovic
Nikola Krgović
Beograd

Član broj: 3534
Poruke: 2807

ICQ: 49345867
Sajt: https://www.twinstarsyste..


+655 Profil

icon Re: Kako modelovati kategorije proizvoda u Djangu?26.09.2019. u 08:13 - pre 54 meseci
Citat:
clydefrog:
@nkrgovic,

Citat:
Bazu modeliras u alatu za bazu. Ne u programskom jeziku :D . Super su te fore, migracije, i slicno, ali nijedan e-commerce koji ima iole normalnu velicinu baze ne pise migracije, trajale bi predugo. Alter table na nekim tabelama na kupindo bazi je trajao po 3-4 sata, da je to migracija ceo sajt bi ti bio down :).


Znači li to da je Django u ovom slučaju promašaj, tj. da se ovaj projekat ne može uraditi koristeći Django?

Hvala što si se javio u svakom slučaju, dobro je čuti savet iz prve ruke.

Naravno da nije, Kupindo je radjen u PHP-u, ali zato sto je, u vreme kada je razvijan, izbor bio mnogo manji.

Evo ti i stara sema, ne znam da li su nesto menjali, ali sumnjam da je nesto puno . https://blog.limundograd.com/2...rhitekturom-limunda-i-kupinda/

Jedino sto je bitno je da shvatis da ne mozes da tretiras bazu kao objekte, da koristis ORM i da modeliras bazu unutar jezika koristeci migracije. To je OK za neke primene, gde je baza vise brzi storage za sitniju kolicinu podataka, ali ecommerce sajtovi koji imaju baze reda velicine terabajt ne mogu tako da rade.

Uostalom, ako hoces da ucis programiranje, apsolutno je dobro da naucis dizajn baza i normalne forme :)
Please do not feed the Trolls!

Blasphemy? How can I blaspheme? I'm a god!'
 
Odgovor na temu

clydefrog

Član broj: 340220
Poruke: 107



+5 Profil

icon Re: Kako modelovati kategorije proizvoda u Djangu?26.09.2019. u 13:07 - pre 54 meseci
@Panta_

Zar ne bi ovaj query trebalo da dohvati Product object 1?

Code:

>>> from products.models import Product, Category
>>> c = Category(name='Books')
>>> c1 = Category(name='Textbooks', parent=c)
>>> c2 = Category(name='Primary school', parent=c1)
>>> p = Product(title='spam', description='spameggs', price=200, year=2018, category=c2)
>>> for x in (c, c1, c2, p):
...     x.save()
... 
>>> Product.objects.filter(Q(category__name='Books') | Q(category__parent__name='Books') | Q(category__parent__parent__name='Books'))
<QuerySet []>


@EDIT:

Problem je bio u tome što je parent dodeljivan pre nego što je snimljen pa nije imao PK, tako da je FK bio setovan na NULL.

Sve u svemu, nije mi ovo rešenje baš najsrećnije. Pogledaj taj monster od querija, i to hardcodovan (šta ako je dubina kategorijske hijerarhije arbitrarna, tj. ako je u slučaju knjiga 3 podkategorije a u slučaju odeće 5, recimo). Nisam zadovoljan.

[Ovu poruku je menjao clydefrog dana 26.09.2019. u 14:41 GMT+1]
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Kako modelovati kategorije proizvoda u Djangu?26.09.2019. u 16:32 - pre 54 meseci
Citat:
Sve u svemu, nije mi ovo rešenje baš najsrećnije. Pogledaj taj monster od querija

Citat:
QuerySets are lazy – the act of creating a QuerySet doesn’t involve any database activity. You can stack filters together all day long, and Django won’t actually run the query until the QuerySet is evaluated.

https://docs.djangoproject.com...db/queries/#querysets-are-lazy

Instaliraj django-debug-toolbar tako da mozes da vidis koji upiti se izvrsavaju.




Ne znam zasto toliko komplikujes query.
Code:
category = Category.objects.get(name='Books')
category.children.all()                                                                                                                                                                    
<QuerySet [<Category: Textbooks>, <Category: Primary school>]>

Product.objects.all().filter(category__name='Textbooks')                                                                                                                              
Out[77]: <QuerySet [<Product: Django za pocetnike>, <Product: PHP za pocetnike>]>
Prikačeni fajlovi
 
Odgovor na temu

clydefrog

Član broj: 340220
Poruke: 107



+5 Profil

icon Re: Kako modelovati kategorije proizvoda u Djangu?26.09.2019. u 16:53 - pre 54 meseci
@Panta_

Kada filtriraš sve proizvode u kategoriji 'Books', on bi trebalo da izlista i sve 'Textbooks' i sve 'Primary school'. Ili kada filtriraš samo 'Textbooks', on bi trebalo da izlista i sve 'Primary school'.

Hvala za django-debug-toolbar, nisam znao da to postoji.

@EDIT:

Naišao sam na neki paket django-mptt, sa njim jednostavno uradiš (nakon malo izmena modela):
Code:

>>> categories = c.get_descendants(include_self=True)
>>> categories
<TreeQuerySet [<Category: Books>, <Category: Textbooks>, <Category: Primary school>]>
>>> Product.objects.filter(category__in=categories)
<QuerySet [<Product: Product object (1)>, <Product: Product object (2)>]>



[Ovu poruku je menjao clydefrog dana 26.09.2019. u 18:13 GMT+1]

[Ovu poruku je menjao clydefrog dana 26.09.2019. u 18:14 GMT+1]

[Ovu poruku je menjao clydefrog dana 26.09.2019. u 18:15 GMT+1]
 
Odgovor na temu

[es] :: Python :: Kako modelovati kategorije proizvoda u Djangu?

[ Pregleda: 1570 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.