Python 使用Django'从两个不同的表中检索值;s QuerySet
对于以下型号:Python 使用Django'从两个不同的表中检索值;s QuerySet,python,django,django-models,Python,Django,Django Models,对于以下型号: class Topping(models.Model): name = models.CharField(max_length=100) class Pizza(models.Model): name = models.CharField(max_length=100) toppings = models.ManyToManyField(Toppping) 我的数据如下所示: 比萨饼和顶级餐桌连接在一起: ID NAME TOPPING
class Topping(models.Model):
name = models.CharField(max_length=100)
class Pizza(models.Model):
name = models.CharField(max_length=100)
toppings = models.ManyToManyField(Toppping)
我的数据如下所示:
比萨饼和顶级餐桌连接在一起:
ID NAME TOPPINGS
------------------------------------
1 deluxe topping_1, topping_2
2 deluxe topping_3, topping_4
3 hawaiian topping_1
我想为所有名为豪华
的比萨饼获取比萨饼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看起来像什么有什么想法吗?如果上面的方法不够具有挑战性,我还想按名称对结果中的配料进行排序。当您有上面模型中的配料时,没有直接的方法可以获得比萨饼。你可以
pizzas = topping.pizza_set.all()
对于所有有顶部或可能有顶部的比萨饼(如果顶部仅存在于一个名为“豪华”的比萨饼上)
一旦你有了浇头。或者,您可以将比萨饼和配料存储在元组列表或字典中(如果没有重复的配料):
然后你可以用字典取比萨饼来做配料。我认为没有一个干净的解决方案,因为你需要两种不同型号的数据。根据您的数据结构,您可能希望使用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))
这将产生:
[
(1, topping_1),
(1, topping_2),
(2, topping_3),
(2, topping_4),
]
现在有不同的方法来设置数据,使用列表、元组和字典,但我想你已经知道如何设置数据了。我也有这个解决方案,我想知道是否有更优雅的方法,因为我也想按名称对我的配料进行排序。可能有更优雅的方法来实现这一点。排序不是问题:toppings=list(toppings)toppings.sort()使用此解决方案,可以按比萨饼对配料进行排序,我的目标是获得豪华比萨饼所有配料的全局排序列表。如果您将豪华比萨饼的所有配料都列在一个如上所述的列表中,并对该列表进行排序,那么它就是一个包含所有配料的“全局”排序列表。如果你想要更“优雅”的比萨,你可以把每一块比萨的配料放在一组中,然后把这一组和整个比萨组合在一起。但比萨饼和配料似乎没什么回报。我现在就去睡觉,明天再回来看看。然后我怎么才能得到每个配料对应的比萨id呢?太好了,这和问题一起帮助解决了我的问题。
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))
[
(1, topping_1),
(1, topping_2),
(2, topping_3),
(2, topping_4),
]