Django Rest框架如何保存基于ID的相关字段的模型 [英] Django Rest Framework how to save a model with Related Field based on ID

查看:138
本文介绍了Django Rest框架如何保存基于ID的相关字段的模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很喜欢DRF。我有记录模型,如下所示:

 类记录(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}。如果我希望视图保存记录,并将活动设置为12的ID为活动,该怎么办?

解决方案

Django REST框架提供一个 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


I'm kind of new to DRF. I have Record model that looks like this:

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)

  ...

The RecordSerializer is this one:

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")

And this is the view:

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

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

The POST request is sent from Backbone and it includes a field with the activity id, for example "{activity:12}". What should I do if I want the view to save the Record and set the activity to the Activity with the id of 12?

解决方案

Django REST Framework provides a PrimaryKeyRelatedField for exactly this use case.

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")

This will produce output similar to what you are looking for, and it will accept the id of the activity when you want to update it.

这篇关于Django Rest框架如何保存基于ID的相关字段的模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆