bobboy老师,你好,我有一个问题,就是想让Model的一个字段根另一个字段设置默认值
来源:3-2 user models设计
Outback
2018-07-03
class Answer(models.Model): """ 对问题的回答 """ problem = models.ForeignKey(Problem, null=False, blank=False, verbose_name="对应的问题", on_delete=models.CASCADE) user = models.ForeignKey(User, null=True, blank=True, verbose_name="用户", on_delete=models.CASCADE) content = models.TextField(null=False, blank=False, verbose_name='回答的内容') answer_id = models.CharField(max_length=32, blank=False, null=False, verbose_name='回答的hash值',
现在的问题是answer_id的值根据content字段的值进行hash得出,这样除了重写save()方法之外还有其他办法吗,我实在是没有找到办法。因为save()方法的代码较多,重写的话有容易出错,谢谢老师。
写回答
1回答
-
Outback
提问者
2018-07-03
自问自答吧,想到了办法就不麻烦老师了,也把答案写下来,供其他同学参考
我是在下边这句代码中找到灵感的,既然这里可以定义默认值,我为什么不能自已定义呢,
user = serializers.HiddenField(default=serializers.CurrentUserDefault())
我在utils.defaul_hash.py文件中写了如下代码
from rest_framework.compat import unicode_to_repr from utils.common import getmd5 class BaseHashId(object): def __init__(self, id_name=None, hash_field=None): self.hash_field = hash_field self.id_name = id_name def set_context(self, serializer_field): content = serializer_field.context.get('request').data.get(self.hash_field) setattr(self, self.id_name, getmd5(content)) def __call__(self): return getattr(self, self.id_name) def __repr__(self): return unicode_to_repr('%s()' % self.__class__.__name__)
然后,在serialiazers中使用就行
class AnswerSerializer(serializers.ModelSerializer): user = serializers.HiddenField(default=serializers.CurrentUserDefault()) answer_id = serializers.HiddenField(default=BaseHashId(id_name='answer_id',hash_field='content')) class Meta: model = Answer fields = ('user', 'problem', 'content', 'answer_id')
因为我要用这种方式生成hash_id的情况会很多,所以这里我使用了动态赋属性的方式,这样就可以重复使用代码。有时想半天没有想到办法,灵感来了,一下子就搞定了。
112018-07-06
Python前后端分离开发Vue+Django REST framework实战
Django REST framework课程视频,RESTFul API前后端分离开发
2873 学习 · 2457 问题
相似问题