Django,DRF(&React)外键,如何显示名称值而不是外键id

时间:2019-02-02 02:56:07

标签: django reactjs django-models django-rest-framework

有两种Django模型-ClientCompany和Proposal,并且ClientCompany的外键在Proposal模型内。在建议我怎么显示ClientCompany而不是外键ID的名称?

models.py:

class ClientCompany(models.Model):
    name = models.CharField("Client Name", max_length=255)
    abn_acn = models.BigIntegerField("ABN / ACN")

    def __str__(self):
        return self.name

class Proposal(models.Model):
    proj_name = models.CharField("Project Name", max_length=255)
    loc_state = models.CharField(
        max_length=3,
    )
    proj_type = models.CharField(
        max_length=30,
    )
    prop_status = models.CharField(
        max_length=20,
    )
    client = models.ForeignKey(ClientCompany, on_delete=models.CASCADE)
    oneic = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='main_engineer')
    twoic = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='second_engineer')
    created_at = models.DateTimeField(default=datetime.now)

    def __str__(self):
        return self.proj_name

serializers.py:

class ClientSerializer(serializers.ModelSerializer):
    class Meta:
        model = ClientCompany
        fields = ('id', 'name', 'abn_acn')


class ProposalSerializer(serializers.ModelSerializer):

    class Meta:
        model = Proposal
        fields = ('id', 'proj_name', 'loc_state', 'proj_type', 'prop_status', 'client', 'oneic', 'twoic',)

queryset api.py:

class ProposalViewSet(viewsets.ModelViewSet):
    permission_classes = [permissions.IsAuthenticated, ]
    queryset = Proposal.objects.all()
    serializer_class = ProposalSerializer

当前shows the client foreign key id

我一直坚持下去,试图应用针对类似问题推荐的现有解决方案,但没有运气...如果有人可以告诉我我所缺少的内容-谢谢

2 个答案:

答案 0 :(得分:1)

我发现最终通过在serializers.py中添加serializers.SlugRelatedField行实现了这一目的:

class ProposalSerializer(serializers.ModelSerializer):

    client = serializers.SlugRelatedField(slug_field="name", read_only=True)

    class Meta:
        model = Proposal
        fields = ('id', 'proj_name', 'loc_state', 'proj_type', 'prop_status',
                  'client', 'oneic', 'twoic',)

答案 1 :(得分:0)

像这样更新您的序列化器:

class ProposalSerializer(serializers.ModelSerializer):
    client = ClientSerializer()
    class Meta:
        model = Proposal
        fields = ('id', 'proj_name', 'loc_state', 'proj_type', 'prop_status', 'client', 'oneic', 'twoic',)