如何解决如何更改可在常规django中使用的此功能以使其与序列化程序一起使用?
伙计们,我有此反馈创建函数,可与django一起使用。.但是我正在尝试实现rest api,但我不确定如何继续和更改此函数。我能够列出所有反馈,没有任何问题,但是不知道如何实现create函数。 帮助将不胜感激。
这是我的模特。
class Action(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,related_name='actions',db_index=True,on_delete=models.CASCADE)
verb = models.CharField(max_length=255)
target_ct = models.ForeignKey(ContentType,blank=True,null=True,related_name='target_obj',on_delete=models.CASCADE)
target_id = models.PositiveIntegerField(null=True,db_index=True)
target = GenericForeignKey('target_ct','target_id')
created = models.DateTimeField(auto_now_add=True,db_index=True)
创建反馈
def create_action(user,verb,target=None):
now = timezone.now()
last_minute = now - datetime.timedelta(seconds=30)
similar_actions = Action.objects.filter(user_id=user.id,verb= verb,created__gte=last_minute)
if target:
target_ct = ContentType.objects.get_for_model(target)
similar_actions = similar_actions.filter(target_ct=target_ct,target_id=target.id)
if not similar_actions:
action = Action(user=user,verb=verb,target=target)
action.save()
return True
return False
序列化器
class GenericActionRelatedField(serializers.RelatedField):
def to_representation(self,value):
if isinstance(value,Post):
serializer = PostListSerializer(value)
return serializer.data
if isinstance(value,Comment):
serializer = CommentSerializer(value)
return serializer.data
class ActionFeedSerializer(serializers.Serializer): #TODO
user = UserSerializer(read_only=True)
verb = serializers.CharField()
target = GenericActionRelatedField(read_only=True)
created = serializers.DateTimeField()
class Meta:
model = Action
fields = ['user','verb','target_ct','target_id','target','created']
非常感谢大家!
解决方法
覆盖to_representation(...)
类的 ActionFeedSerializer
方法,
class ActionFeedSerializer(serializers.Serializer): # TODO
user = UserSerializer(read_only=True)
verb = serializers.CharField()
target = GenericActionRelatedField(read_only=True)
created = serializers.DateTimeField()
class Meta:
model = Action
fields = ['user','verb','target_ct','target_id','target','created']
def create(self,*arg,**kwargs):
instance = super().create(*arg,**kwargs)
create_action(instance.user,instance.verb,instance.target)
return instance
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。