【问题标题】:django rest serialize level 2 fielddjango rest序列化2级字段
【发布时间】:2014-03-06 17:47:12
【问题描述】:

您好,我需要在 2 级引用项的序列化程序中添加一个字段。

我有以下型号:

模型.py:

class Company(models.Model):
   companyName = models.CharField(max_length=50, blank=True)

class Poll(models.Model):
   questionString = models.CharField(max_length=500, blank=True)
   companyId = models.ForeignKey(Company, null=True, db_column='companyId', blank=True)

class PossibleAnswer(models.Model):
   answerString = models.CharField(max_length=100, blank=True)
   pollId = models.ForeignKey(Poll, null=True, db_column='pollId', blank=True,related_name='answers')
   token = models.CharField(max_length=10, blank=True)

serializers.py:

class PossibleAnswerSerializer(serializers.ModelSerializer):
   #companyId = serializers.RelatedField()
   class Meta:
       model = PossibleAnswer
       fields = ('answerString', 'token', 'pollId', 'companyId')

我想为具有名为 company 的字段的 PossibleAnswer 对象创建一个序列化程序。如何做这个参考?类似于:django 查询集过滤器中的 pollId__companyId。

【问题讨论】:

  • 将 Django fkey 字段命名为 pollId 不是一个好主意——该字段将包含 Poll 对象,而不是 ID。
  • 需要写入字段还是只读?
  • 我认为,它可以是只读的。我需要使用 companyId 创建自定义权限,以检查某个用户是否可以创建 PossibleAnswer。

标签: python django serialization django-rest-framework


【解决方案1】:

另一种解决方案...

class PossibleAnswerSerializer(serializers.ModelSerializer):
   companyId = serializers.SerializerMethodField()

   def get_companyId(self, obj):
        return obj.pollId.companyId

   class Meta:
       model = PossibleAnswer
       fields = ('answerString', 'token', 'pollId', 'companyId',)

【讨论】:

    【解决方案2】:

    如果该字段是只读的,您可以使用serializers.Field 轻松实现这一点,它接受源的虚线路径。

    你的序列化器是:

    class PossibleAnswerSerializer(serializers.ModelSerializer):
        companyId = serializers.Field(source='pollId.companyId')
        class Meta:
            model = PossibleAnswer
            fields = ('answerString', 'token', 'pollId', 'companyId')
    

    我也同意 Erik 的观点,即使 DB 表示只是 ID,使用 Id 命名模型属性也是一个坏主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 2021-03-07
      相关资源
      最近更新 更多