2014-07-25 8 views
5

Jak mogę utworzyć to zapytanie mysql w ORM django?Django Zapytanie ORM z wieloma polami łączenia

SELECT search_products.model, search_products.year, search_products.size, search_avg_price.estimated_price 
FROM search_products 
left JOIN search_avg_price 
ON search_products.model=search_avg_price.model and search_products.size=search_avg_price.size and search_products.year=search_avg_price.year 

Próbowałem już

latest_products = Products.objects.all().prefetch_related("avg_price") 

ale to jest tłumaczone przez Django jako

SELECT `search_products`.`id`, `search_products`.`size`, `search_products`.`year`, , `search_products`.`model`, `search_products`.`avg_price_id` 
FROM `search_products` 

i

latest_products = Products.objects.all().select_related("avg_price") 

to jest tłumaczone przez Django jak:

SELECT `search_products`.`id`, `search_products`.`size`, `search_products`.`year`, , `search_products`.`model`, `search_products`.`avg_price_id`, `search_avg_price`.`id`, `search_avg_price`.`model`, `search_avg_price`.`size`, `search_avg_price`.`year`, `search_avg_price`.`estimated_price` 
FROM `search_products` 
INNER JOIN `search_avg_price` ON (`search_products`.`avg_price_id` = `search_avg_price`.`id`) 

jeśli biegnę powyższy SQL w bazie danych otrzymuję prawidłowego rezultatu ...

EDIT: modele i widoki

class Avg_price(models.Model): 
model = models.CharField(max_length=50, blank=True) 
size= models.IntegerField(blank=True, null=True) 
year= models.IntegerField(blank=True, null=True) 
estimated_price= models.IntegerField(blank=True, null=True) 

class Products(models.Model): 
product_id =models.IntegerField(blank=True, null=True) 
link_id = models.CharField(max_length=200, blank=True) 
location = models.CharField(max_length=200, blank=True) 
model = models.CharField(max_length=50, blank=True) 
size= models.IntegerField(blank=True, null=True) 
price= models.IntegerField(blank=True, null=True) 
year= models.IntegerField(blank=True, null=True) 
type=models.ForeignKey(Type) 
avg_price = models.ForeignKey(Avg_price) 

def __unicode__(self): # Python 3: def __str__(self): 
    return self.location 

Szablon

{% if latest_products %} 
    {% for product in latest_products %} 
    <ul> 
    <li id="col_one"> 
     <h5>{{product.avg_price.estimated_price}}</h5> 
     <h5>{{product.model}}</h5> 
+0

nie robić chcesz "select_related" lub "prefetch_related" dla tego, chcesz użyć filtra do powiązania z innym modelem, zakładając klucz obcy lub wiele do wielu relacji. Czy możesz opublikować swój kod modelu? – Tom

Odpowiedz

1

Try zapytania tak:

qs = Product.objects.filter(
    avg_price__model__isnull=True).filter(
    avg_price__size__isnull=True).filter(
    avg_price__year__isnull=True).values_list(
    'model', 'year', 'size', 'avg_price__estimated_price') 

Aby przetestować:

print(qs.query) 

Objaśnienie:

Od modelu produktu, masz dostęp do ForeignKey każdym razem na avg_price i pole względne w tym modelu, który chcesz mieć NULL za każdym razem, kiedy wrócisz zapytanie oparte na LEFT JOIN. Oto dokumentację ups wygląd, obejmujących relacje:

https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

Następnie values_list pozwala ci określić, jakie wartości do powrotu. Oto dokumentację values_list:

https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values_list

+0

Próbowałem i otrzymałem błąd: "FieldError: Nie można rozwiązać słowa kluczowego" avg_price.estimated_price "w polu". Wydaje się, że django nie jest w stanie zobaczyć drugiej tabeli ... Również powinienem pokazać wszystkie wyniki z produktów tabeli i dodać wynik z tabeli avg_price, ilekroć jest obecny (mach of year, model i size) ... thanks for the help – user2950162

+0

Co powiesz na 'avg_price__estimated_price' zamiast' avg_price.estimated_price'? –

+0

Wynikowe zapytanie różni się od tego, które chcę zbudować ... WYBIERZ 'search_productsmodel',' search_products''year', 'search_products' .size',' search_avg_price'"estestated_price' FROM 'search_products' INNER JOIN 'search_avg_price' ON (' search_products'.'avg_price_id' = 'search_avg_price'.'id') WHERE (' search_avg_price' .model' ma wartość NULL, a 'search_avg_price's.size' ma wartość NULL i wartość' search_avg_price'. " year' IS NULL) – user2950162

1

można przekazać listę tabel do sposobu Extra() i umieścić warunki z ON w zapytaniu SQL gdzie sekcja w extra()

Product.objects.extra(
    tables=['search_avg_price'], 
    where=[ 
     '"search_products"."model"="search_avg_price"."model"', 
     '"search_products"."size"="search_avg_price"."size"', 
     '"search_products"."year"="search_avg_price"."year"' 
    ] 
) 

czytaj więcej o dodatkowa: https://docs.djangoproject.com/en/1.6/ref/models/querysets/#extra

Powiązane problemy