如何从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

我正在尝试从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)
    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问题。