如何在Django序列化器中获取外键id而不是引用模型

时间:2017-03-18 10:59:23

标签: django django-views django-serializer

我是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"
}

提前致谢,

乔鲍

1 个答案:

答案 0 :(得分: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)

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

您的输出与序列化器的外观略有不同。

{
    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"
}

我希望它有所帮助。