使用Django从两个表中选择值

时间:2013-06-06 12:03:31

标签: django django-models

我有两张表如下,

cabinet_id     cabinet_name
1               Test1
2               Test2
3               Test3

cabinet_maping

id   product_id    cabinet_id   size
1      34              1            20
2      34              3            25

如何从Django中cabinet_mapingproduct_id = 34的橱柜表中选择所有cabinet_name

预期输出如下,

cabinet_id   cabinet_name    size
1             Test1            20
2             Test2            0
3             Test3            25

2 个答案:

答案 0 :(得分:0)

我认为你的模特看起来像

class Cabinet(models.Model):
     name = models.CharField(max_length = 30)

class cabinet_maping(models.Model):
     product = models.ForeignKey(Product)
     cabinet = models.ForeignKey(Cabinet)
     size = .....

你应该这样做:

cabinet_name = cabinet_maping.objects.filter(product__id = 34)

for item in cabinet_name:
     print item.cabinet.id 
     print item.cabinet.name
     print item.size

我没有检查它,但我认为这应该有用(有效:))

答案 1 :(得分:0)

我同意Silwestpl的说法,你的模型是错误的,因为使用外键可以使这个查询更容易。但只是回答你的问题。我假设你没有任何关系,因为你没有提到任何关系。

x = Cabinet_mapping.objects.filter(product_id = somevalue).distinct('cabinet_id')

response_list = []

for y in x:
    response_dict = {}
    response_dict['cabinet_id'] = y.cabinet_id
    response_dict['cabinet_name'] = cabinet.objects.get(id = y.cabinet_id).cabinet_name
    response_dict['size'] = y.size

    response_list.append(response_dict)

return response_list

根据您提供的详细信息,这将是答案。

但理想情况下我会做这样的事情

class Product(models.Model):
   # id is generated automatically.
   ## any other fields that you want for product.

class Cabinet(models.Model):
   # again id is auto-genearated.
   cabinet_name = models.CharField(max_length=100)
   cabinet_size = models.IntegerField()
   products = models.ManytoManyField(Product)#This automatically maps product_id n cabinet_id.

您的查询将是。

x = Cabinet.objects.filter(product.id=some_value)
print (x.id , x.cabinet_name, x.cabinet_size) # I used print, but you can use it anyway you want.

这就是你所需要的。如果你正在研究一些严肃的事情,请使用第二种解决方案。