Wie könnte ich diese mysql-Abfrage in django ORM machen?Django-ORM-Abfrage mit mehreren Join-Feldern
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
Ich habe bereits versucht,
latest_products = Products.objects.all().prefetch_related("avg_price")
aber von django als
SELECT `search_products`.`id`, `search_products`.`size`, `search_products`.`year`, , `search_products`.`model`, `search_products`.`avg_price_id`
FROM `search_products`
und
latest_products = Products.objects.all().select_related("avg_price")
Dieser von django übersetzt übersetzt:
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`)
wenn ich die oben SQL in der Datenbank ausgeführt ich das richtige Ergebnis zu erhalten ...
Edit: Modelle und Ansichten
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
Vorlage
{% if latest_products %}
{% for product in latest_products %}
<ul>
<li id="col_one">
<h5>{{product.avg_price.estimated_price}}</h5>
<h5>{{product.model}}</h5>
Sie dies nicht tun Möchten Sie 'select_related' oder' prefetch_related' für diesen Zweck verwenden, möchten Sie den Filter verwenden, um eine Bindung mit dem anderen Modell herzustellen, wobei eine Fremdschlüssel- oder Viele-zu-Viele-Beziehung vorausgesetzt wird. Können Sie Ihren Modellcode posten? – Tom