使用Django的查询从两个不同的表检索值

2024-09-27 04:23:46 发布

您现在位置:Python中文网/ 问答频道 /正文

对于以下型号:

class Topping(models.Model):
    name = models.CharField(max_length=100)

class Pizza(models.Model):
    name = models.CharField(max_length=100)
    toppings = models.ManyToManyField(Toppping)

我的数据如下:

披萨和顶级餐桌连接:

^{pr2}$

我想得到所有名为deluxe的披萨id和相应的配料。我的预期结果是:

1   topping_1
1   topping_2
2   topping_3
2   topping_4

连接表是:

pizza_toppings
--------------
id    
pizza_id    
topping_id

下面是我想要实现的SQL等价物:

SELECT p.id, t.name
FROM pizza_toppings AS pt
INNER JOIN pizza AS p ON p.id = pt.pizza_id
INNER JOIN topping AS t ON t.id = pt.topping_id
WHERE p.name = 'deluxe'    

对相应的Django Queryset有什么看法吗?如果上面的内容不够有挑战性的话,我还想按名字来排序。在


Tags: nameptidmodelmodelsaslengthmax
2条回答

当你从上面的模型中得到一个比萨饼时,没有直接的方法可以得到一个比萨饼。你可以的

pizzas = topping.pizza_set.all()

适用于所有有顶饰的披萨(如果只有一个披萨上有“豪华”字样)

^{pr2}$

一旦你有了顶料。或者,您可以将披萨和配料存储在元组列表或字典中(如果没有重复的配料):

toppings = {}
pizzas = Pizza.objects.filter(name="deluxe")
for pizza in pizzas:
    for topping in pizza.toppings.all():
        toppings[topping.name] = pizza.name
sorted_toppings = toppings.keys()
sorted_toppings.sort()

然后你就可以用字典把比萨饼拿来做配料。在

我不认为有一个干净的解决方案来解决这个问题,因为您需要两个不同模型的数据。根据您的数据结构,您可能需要使用select_related,以避免所有配料都进入数据库。为了你想要的结果,我会:

result = []
pizzas = Pizza.objects.select_related().filter(name='deluxe')
for pizza in pizzas:
    for toppings in pizza.toppings.all():
        result.append((pizza.pk, topping.name))

这将产生:

^{pr2}$

现在有不同的方法来设置数据,使用列表、元组和字典,但是我想您已经知道了如何进行设置了。在

相关问题 更多 >

    热门问题