【问题标题】:How to get foreign key id instead of referenced model in Django serializers如何在 Django 序列化程序中获取外键 ID 而不是引用模型
【发布时间】:2017-03-18 10:59:22
【问题描述】:

我真的是 Django 新手,但是在我们的项目中,我们有一个 Django 后端,没有其他人愿意接触它,所以我必须对此进行一些调整。 模型设置好了,一切正常,但是我们需要一个新的视图,在哪里 我们需要关于我们的模型之一的基本数据,没有引用模型(只需要外键 id)。我花了一天时间寻找解决方案。也许它太琐碎了,它没有写在任何地方:)

型号:

class Row(models.Model):
    row = models.IntegerField(null=True, blank=True)
    height = models.TextField(null=True, blank=True)
    key = models.CharField(max_length=36, unique = True)

    def save(self, *args, **kwargs):
        super(Row, self).save(*args, **kwargs)


class Column(models.Model):
    col = models.IntegerField(null=True, blank=True)
    width = models.TextField(null=True, blank=True)

    key = models.CharField(max_length=36, unique = True)

    def save(self, *args, **kwargs):
        super(Column, self).save(*args, **kwargs)


class Product(models.Model):

    key = models.CharField(max_length=36, unique = True)

    text = models.TextField(null=True, blank=True)

    column = models.ForeignKey(Column, db_column='column_key', to_field='key', related_name="products")
    row  = models.ForeignKey(Row, db_column='row_key', to_field='key', related_name="products")
    merged_with = models.ForeignKey("Product", db_column='merged_with_key', to_field='key', related_name="merges", blank=True, null=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    updated_by = models.ForeignKey('auth.User', null=True)

现在我需要一个视图中的产品列表,json 输出如下所示:

{
    id: 1,
    key: "1746495d-8ea0-42df-9ed9-06df621ef7c5",
    column_key: "<key of refrenced column>"
    merged_with_key: "<key of refrenced product>"
    row_key: "<key of refrenced row>"
    text: "sometext"
}

提前致谢,

沙巴

【问题讨论】:

    标签: django django-views django-serializer


    【解决方案1】:

    您需要的是对 ModelSerializer 的简单扩展。 谁的定义看起来像这样。

    class ProductSerializer(serializers.ModelSerializer):
        class Meta:
            model = Products
            fields = ('id','key', 'column', 'merged_with', 'row', 'text')
    

    还有这样的新观点。

    class ProductListView(APIView):
    
        def get(self, request):
            return Response(ProductSerializer(Products.objects.all(), many=True).data)
    

    您必须将 url 映射到此视图并导入必要的依赖项。

    您的输出看起来与序列化程序略有不同。

    {
        id: 1,
        key: "1746495d-8ea0-42df-9ed9-06df621ef7c5",
        column: "<key of refrenced column>"
        merged_with: "<key of refrenced product>"
        row: "<key of refrenced row>"
        text: "sometext"
    }
    

    我希望它有所帮助。

    【讨论】:

    • 感谢您的快速回复。结果是,我们想要的 :) 但是分析在后端执行的查询,我意识到,所有的外键记录都被读取了。所以现在 *3 查询运行而不是 1。当我不需要引用对象时,如何阻止它?我知道,也许这是另一个问题...
    • 啊不确定,但您可以尝试将字段从“column”、“merged_with”、“row”更改为“column_id”、“merged_with_id”、“row_id”,
    • 不,这不起作用。获取:字段名称row_key 对模型Product 无效我将开始另一个问题。再次感谢您的回答。这解决了原来的问题。
    • 你应该使用queryset.select_related(&lt;foreign keys fields names&gt;)
    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 2011-04-30
    • 2021-02-13
    • 2021-03-19
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多