使用属性修改模型字段Django

用户名

我有如下所示的模型字段:

user=models.ForeignKey(CustomUser, null=True)
_corporate = models.CharField(max_length=10, null=True, db_column='corporate')
def set_corporate(self,value):
    if self.user.corporateuser_set.all():
        self._corporate = self.user.corporateuser_set.values_list('company', flat=True)
corporate= property(set_corporate)

不知何故,未评估set_corporate,因此_corporate字段未更新。

那么我应该怎么做才能使其正常工作呢?最好的方法是什么?

我有另一个与用户模型具有一对多关系的模型(CorporateUser),这只是为了澄清我的问题。

您在很多方面都做错了。

首先,在python中以这种方式使用属性:

class A:
    @property
    def foo(self):
        return self._foo

    @foo.setter
    def foo(self, value):
        self._foo = value

或者这样:

class A:
    def get_foo(self):
        return self._foo

    def set_foo(self, value):
        self._foo = value

    foo = property(get_foo, set_foo)

注意如何将值传递给设置器。不应像您那样在此处进行计算。如果您需要自动更新公司价值,则不需要属性,则应覆盖模型.save()方法或侦听其pre_save信号并在那里更新字段。

其次,您不应有条件地设置在setter中。设置器应始终将属性设置为传递的值。像这样:

def set_corporate(self, value):
    # If the list is empty then corporate becomes empty
    self._corporate = \
        self.user.corporateuser_set.values_list('company', flat=True)

通过违反此规则,您将引起悲伤:

obj.corporate = 'hi'
# obj.corporate is now 'hi'
obj.corporate = ''
# obj.corporate is still 'hi'. WTF?

第三,您不应分配listCharField这应该如何工作?它将使它字符串化。

第四,您甚至没有分配列表,而是分配了查询集,这更糟。

第五,您实际上在两行中两次执行了相同的数据库请求。检查是否为空然后赋值的有效方法是重用同一查询集:

corporates = self.user.corporateuser_set.values_list('company', flat=True)
if corporates:
    # Stringify it explicitly and our way
    self._corporate = ','.join(corporates)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用表单字段更新Django模型

来自分类Dev

Django模型:删除字段

来自分类Dev

在Django中临时修改模型的字段值

来自分类Dev

使用模板中的表单访问模型字段的属性

来自分类Dev

使用django对一个模型的属性使用多个输入字段

来自分类Dev

在Django中访问模型字段和属性

来自分类Dev

Django 1.7-修改模型的属性

来自分类Dev

更改模型以添加“直通”关系以订购ManytoMany字段-Django 1.7迁移修改

来自分类Dev

Django-模型字段和模型属性之间有什么区别?

来自分类Dev

Django:具有不同字段的模型(实体-属性-值模型)

来自分类Dev

如何修改Django模型?

来自分类Dev

Django模型字段,用于用户可修改的自定义排序

来自分类Dev

Django模型:使用外键中的字段

来自分类Dev

使用QuerySet的Django模型中的计算属性

来自分类Dev

Django:在保存之前修改模型的字段

来自分类Dev

在Django中使用中间模型属性访问字段

来自分类Dev

如何通过关系字段的属性过滤Django模型?

来自分类Dev

Django,使用ForeignKey将模型字段与管理模型字段链接

来自分类Dev

如何使用模型属性验证Django表单?

来自分类Dev

Django模型:删除字段

来自分类Dev

使用django对一个模型的属性使用多个输入字段

来自分类Dev

使用South修改模型字段的数据

来自分类Dev

Django 1.7-修改模型的属性

来自分类Dev

使用表单更新Django中的模型属性

来自分类Dev

RSpec对模型使用旧的属性字段?

来自分类Dev

如何在Django中修改布尔型字段模型?

来自分类Dev

在 Django Admin 中仅有权修改模型的一个字段的用户

来自分类Dev

Django:如何在模型字段的默认属性中使用数据库参数?

来自分类Dev

Django 模型到字段

Related 相关文章

热门标签

归档