Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django'从两个不同的表中检索值;s QuerySet_Python_Django_Django Models - Fatal编程技术网

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),
]