Wpis z mikrobloga

Mirki zastanawiam się jak rozwiązać taki problem, chodzi o wyszukiwanie w bazie danych. Mam dwie tabele o danej strukturze: Offers: id, name; OffersParameters: id, offer (foreign), parameterid, value; Jak wyszukać oferty w których parametr (parameterid) np. 10 = Warszawa i 300 = Zamojskiego. Mam zaćmienie jak to zrobić w SQL. Poradziłem sobie w inny sposób, ale mam niesmak, że nie jest to zrealizowane w SQL, a najlepiej bezpośrednio używając ORM Django. #programowanie #sql #django #postgresql
  • 15
@lu43n: o = OffersParameters.objects.filter(parameterid=10)

Edit:

Tylko jak korzystasz z python manage.py shell, jak nie wiesz co to to poczytaj w dokumentacji django

Edit2

Cos zle przeczytalem, to jeszcze musisz zrobic cos typu o.offers_set.all()
@kaab10 no to mi da liste parametrow o id 10 i moge przyrownac rozniez value do wyszukiwanego tekstu, wiem, ze moge potem wyciągnąć offer, tylko co gdy chce jeszcze jeden parametr dodac do wyszukania?
Ok, mam coś takiego, ale czy to jest poprawne?

SELECT * FROM offersoffer AS oo LEFT JOIN offersofferparameters op ON oo.id = op.offerid AND op.parameterid = 46 LEFT JOIN offersofferparameters op2 ON oo.id = op2.offerid AND op2.parameter_id = 300 WHERE op.value = 'WARSZAWA' AND op2.value = 'Puławska'
@lu43n: a czemu ma nie być ? takie cośrobi sięw zapytaniu i tyle, przecież w orm też powinna być taka opcja gdzie możesz ustawić sobie relacje i w jakimś query builderze cisnąć
@MQs: Mam dynamiczną listę parametrów dla każdej oferty, dlatego jest w osobnej tabeli.

Czyli dla tabeli offerparameters (offer, parameterid, value): (1, 46, Warszawa), (2, 46, Poznań)... itp.. pierwsza id to oferta
@MQs: @Jurigag: @kaab10: Ok, rozkminiłem nie wiedziałem, że można tak używać metod w django queryset. Rozwiązanie:

Offer.objects.filter(offerparameters__parameter_id=46, offerparameters__value='WARSZAWA').filter(offerparameters__parameter_id=300, offerparameters__value='Biskupia')
Generuje SQL:

SELECT "offers_offer"."id", "offers_offer"."signature", "offers_offer"."slug", "offers_offer"."description" FROM "offers_offer" INNER JOIN "offers_offerparameters" ON ("offers_offer"."id" = "offers_offerparameters"."offer_id") INNER JOIN "offers_offerparameters" T4 ON ("offers_offer"."id" = T4."offer_id") WHERE ("offers_offerparameters"."value" = WARSZAWA AND "offers_offerparameters"."parameter_id" = 46 AND T4."value" = Biskupia AND T4."parameter_id" = 300)
Dzięki za pomoc :)