【问题标题】:Django, DRF (& React) Foreign key, how to display the name value instead of the foreign key idDjango,DRF(&React)外键,如何显示名称值而不是外键id
【发布时间】:2019-06-26 14:59:03
【问题描述】:

有两个 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',)

查询集 api.py:

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

目前shows the client foreign key id

我一直坚持这一点,尝试应用针对类似问题推荐的现有解决方案,但没有运气......如果有人能告诉我我错过了什么 - 谢谢

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复,但我遇到了这个错误:未捕获的错误:对象作为 React 子级无效(找到:带有键 {id、name、abn_acn} 的对象)。如果您打算渲染一组子项,请改用数组。
  • @tangnology 因为客户端的值是 ReactJs 提案列表中的字典。如果您只想要客户的名称,您可以查看我的答案的更新部分。
  • @tangnology 如果您只想使用名称,那么您的答案是最合适的。但是您可以尝试使用proposalObject.client.name(其中proposalObject 是通过API 发送的提案对象)来让client 做出反应吗?
【解决方案2】:

我发现这最终通过在 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',)

【讨论】:

    猜你喜欢
    • 2020-08-19
    • 2019-12-07
    • 1970-01-01
    • 2015-05-08
    • 2021-12-14
    • 2019-03-16
    • 2021-06-19
    • 2019-10-10
    • 2019-02-28
    相关资源
    最近更新 更多