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的情况会很多,所以这里我使用了动态赋属性的方式,这样就可以重复使用代码。有时想半天没有想到办法,灵感来了,一下子就搞定了。

1
1
bobby
非常赞,通过分析源码的功能去解决自己的问题,这个思路非常重要,其他同学也可以借鉴一下
2018-07-06
共1条回复

Python前后端分离开发Vue+Django REST framework实战

Django REST framework课程视频,RESTFul API前后端分离开发

2873 学习 · 2457 问题

查看课程