如何从django获取内部联接中的一些字段?
我正在尝试从django中的数据库中获取一些字段 我的模型:如何从django获取内部联接中的一些字段?,django,django-models,django-rest-framework,Django,Django Models,Django Rest Framework,我正在尝试从django中的数据库中获取一些字段 我的模型: class Category(models.Model): name = models.CharField(max_length=200) def __str__(self): return self.name class Product(models.Model): product_Description = models.CharField(max_length=255) pro
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Product(models.Model):
product_Description = models.CharField(max_length=255)
product_Comments = models.CharField(max_length=255)
size = models.CharField(max_length=10, null=True)
product_Status = models.BooleanField(default=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True)
date_Created = models.DateTimeField(default=datetime.now, blank=True)
date_Modified = models.DateTimeField(default=datetime.now, blank=True)
def __str__(self):
return self.product_Description
我的序列化程序:
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ('id', 'product_Description', 'product_Comments', 'product_Status', 'category', 'date_Created',
'date_Modified')
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ('id', 'name')
class InventorySerializers(serializers.ModelSerializer):
model_b = CategorySerializer(source="category")
class Meta:
model = Product
fields = ('id', 'product_Description', 'product_Comments', 'product_Status', 'category', 'date_Created',
'date_Modified', 'model_b')
和my view.py:
class inventoryList(generics.ListCreateAPIView):
queryset = Product.objects.select_related('category')
print(str(queryset.query))
serializer_class = InventorySerializers
def get_object(self):
queryset = self.queryset()
obj = get_object_or_404(queryset)
return obj
结果是:
[
{
"id": 9,
"product_Description": "Corbata roja gruesa",
"product_Comments": "Corbate para ocasiones especiales",
"product_Status": true,
"category": 1,
"date_Created": "2018-07-24T19:53:13Z",
"date_Modified": "2018-07-24T19:53:13Z",
"model_b": {
"id": 1,
"name": "Corbata"
}
}
]
但我需要它,因为:
[
{
"id": 1,
"name": "Corbata",
"items": {
"id": 9,
"product_Description": "Corbata roja gruesa",
"product_Comments": "Corbate para ocasiones especiales",
"product_Status": true,
"category": 1,
"date_Created": "2018-07-24T19:53:13Z",
"date_Modified": "2018-07-24T19:53:13Z"
}
}
]
我试图改变序列化程序,如下所示:
class InventorySerializers(serializers.ModelSerializer):
model_b = ProductSerializer(many=True)
class Meta:
model = Category
fields = ('id', 'name', 'model_b')
class inventoryList(generics.ListCreateAPIView):
queryset = Category.objects.select_related()
print(str(queryset.query))
serializer_class = InventorySerializers
def get_object(self):
queryset = self.queryset()
obj = get_object_or_404(queryset)
return obj
SELECT "reservation_product"."id", "reservation_product"."product_Description", "reservation_product"."product_Comments", "reservation_product"."size", "reservation_product"."product_Status", "reservation_product"."category_id", "reservation_product"."date_Created", "reservation_product"."date_Modified", "reservation_category"."id", "reservation_category"."name"
FROM "reservation_category"
LEFT OUTER JOIN "reservation_product" ON ("reservation_category"."id" = "reservation_product"."category_id")
但在本例中,查询将打印
SELECT "reservation_category"."id", "reservation_category"."name" FROM "reservation_category"
在这种情况下,不会在我的两个表之间进行连接
在这种情况下,查询如何使from out from“reservation\u category”和连接表“reservation\u product”如下所示:
class InventorySerializers(serializers.ModelSerializer):
model_b = ProductSerializer(many=True)
class Meta:
model = Category
fields = ('id', 'name', 'model_b')
class inventoryList(generics.ListCreateAPIView):
queryset = Category.objects.select_related()
print(str(queryset.query))
serializer_class = InventorySerializers
def get_object(self):
queryset = self.queryset()
obj = get_object_or_404(queryset)
return obj
SELECT "reservation_product"."id", "reservation_product"."product_Description", "reservation_product"."product_Comments", "reservation_product"."size", "reservation_product"."product_Status", "reservation_product"."category_id", "reservation_product"."date_Created", "reservation_product"."date_Modified", "reservation_category"."id", "reservation_category"."name"
FROM "reservation_category"
LEFT OUTER JOIN "reservation_product" ON ("reservation_category"."id" = "reservation_product"."category_id")
首先…风格上…你有一个有趣的CamelCase和snake_案例的混合…所以我会选择一个…在Python中通常是snake_案例。(我的答案只使用了你所说的,我所有的补充都是蛇的情况) 至于这个问题。。。这不是连接的问题…而是正确配置序列化程序的问题 我假设你想要的是:
[
{
"id": 1,
"name": "Corbata",
"items": [
{
"id": 9,
"product_Description": "Corbata roja gruesa",
"product_Comments": "Corbate para ocasiones especiales",
"product_Status": true,
"category": 1,
"date_Created": "2018-07-24T19:53:13Z",
"date_Modified": "2018-07-24T19:53:13Z"
}
]
}
]
如果这是你想要的……我会做以下事情:
模型(这里的变化是,我在外键
中添加了一个相关的\u名称
,它允许您使用更好的名称(产品)遍历向后关系…我还从该视图中的产品中删除了类别
,因为它是多余的。此外…我没有将该字段称为项
,而是将其保留为产品
,因为这更具描述性…但显然,您可以做对您有意义的事情
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Product(models.Model):
product_Description = models.CharField(max_length=255)
product_Comments = models.CharField(max_length=255)
size = models.CharField(max_length=10, null=True)
product_Status = models.BooleanField(default=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, related_name='products')
date_Created = models.DateTimeField(default=datetime.now, blank=True)
date_Modified = models.DateTimeField(default=datetime.now, blank=True)
def __str__(self):
return self.product_Description
序列化程序(请注意,类别序列化程序现在将有一个“产品”列表)
视图(我已将查询集更改为以类别开始,因为类别是此处的根对象。我还使用了prefetch\u related
而不是select\u related
,因为此处存在一对多关系)
有几件事需要注意。。。
1.我没有测试此代码…因此视图可能需要一些调整(我不确定get\u object
在这里是否有意义)。
2、我认为这有点糟糕的API设计。我不喜欢有嵌套的事物列表,因为它降低了你的分页能力。如果你有很多类别,然后在每一个类别中有很多产品,这个调用会变得非常昂贵和难以管理。
希望这能有所帮助。我还应该补充一点……这更像是django rest框架问题,而不是django问题。