使用Django从两个表中选择值

使用Django从两个表中选择值,django,django-models,Django,Django Models,我有两张桌子如下: cabinet_id cabinet_name size 1 Test1 20 2 Test2 0 3 Test3 25 内阁 cabinet_id cabinet_name 1 Test1 2 Test2 3 Test3 机柜映射 i

我有两张桌子如下:

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

cabinet_id     cabinet_name
1               Test1
2               Test2
3               Test3
机柜映射

id   product_id    cabinet_id   size
1      34              1            20
2      34              3            25
如何从Django中的cabinet表中选择所有cabinet\u名称,其中
cabinet\u maping
product\u id=34

预期产出如下:

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

我想你的模特可能看起来像

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

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

我同意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.

这正是你所需要的。如果您正在调查严重问题,请使用第二种解决方案。

机柜是否与机柜映射存在1对1关系?您的模型是如何配置的?到目前为止,您尝试了什么?Django并不是手动查询表(当djangos orm命令不能得到所需的结果或没有提供所需的查询命令时,您可以这样做)。它在ORM上提供了与模型密切相关的属性。我认为这将只返回在cabinet_映射中显示的带有1和3的cabinet_id。它不会返回CAB_id 2