使用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