【问题标题】:Django Rest Framework how to save a model with Related Field based on IDDjango Rest Framework如何根据ID保存具有相关字段的模型
【发布时间】:2015-01-17 16:17:31
【问题描述】:

我对 DRF 有点陌生。我的 Record 模型看起来像这样:

class Records(models.Model):
    owner = models.ForeignKey(User, null=True)
    activity = models.ForeignKey(Activity, null=True)
    time_start = models.DateTimeField(null=True)
    time_end = models.DateTimeField(null=True)

  ...

RecordSerializer 就是这个:

class RecordSerializer(serializers.ModelSerializer):

    now = datetime.today()
    owner = serializers.Field(source='owner.username')
    time_start = serializers.DateTimeField(source='now')

    class Meta:
        model = Records
        fields = ("owner", "activity", "time_start")

这是视图:

class StartApiView(generics.CreateAPIView):
    model = Records
    serializer_class = RecordSerializer

    def pre_save(self, obj):
        obj.owner = self.request.user

POST 请求是从 Backbone 发送的,它包含一个带有活动 ID 的字段,例如“{activity:12}”。如果我想让视图保存Record并将activity设置为id为12的Activity怎么办?

【问题讨论】:

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


    【解决方案1】:

    接受的答案对于 DRF v2.x 是正确的,但 is no longer for newer (3.x) versions,因为它会引发 AssertionError

    AssertionError:关系字段必须提供queryset 参数,或设置read_only=True

    对于较新的版本,只需添加 queryset 参数即可:

    class RecordSerializer(serializers.ModelSerializer):
        activity = serializers.PrimaryKeyRelatedField(queryset=Activity.objects.all())
        // [...] 
    

    【讨论】:

      【解决方案2】:

      Django REST Framework provides a PrimaryKeyRelatedField 正是这个用例。

      class RecordSerializer(serializers.ModelSerializer):
          activity = serializers.PrimaryKeyRelatedField()
          owner = serializers.CharField(read_only=True, source='owner.username')
          time_start = serializers.DateTimeField(source='now')
      
          class Meta:
              model = Records
              fields = ("owner", "activity", "time_start")
      

      这将产生类似于您正在寻找的输出,并且当您想要更新它时,它将接受活动的id

      【讨论】:

      • 感谢您的回答,非常有用的参考。我会在视图正常工作后立即接受它。现在我正在尝试解决另一个错误,我在这个问题上发布了它,也许你也可以帮我一把:stackoverflow.com/questions/27030449/…
      猜你喜欢
      • 2013-01-12
      • 1970-01-01
      • 2021-12-31
      • 2019-06-16
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      相关资源
      最近更新 更多