Django Rest框架如何保存基于ID的相关字段的模型 [英] Django Rest Framework how to save a model with Related Field based on ID
问题描述
类记录(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屋!