首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用属性修改模型字段Django

使用属性修改模型字段Django
EN

Stack Overflow用户
提问于 2013-12-09 10:23:06
回答 2查看 2.8K关注 0票数 2

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

代码语言:javascript
复制
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),它与用户模型有一对多的关系,这只是为了澄清我的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-09 12:05:04

你在很多方面都做错了。

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

代码语言:javascript
复制
class A:
    @property
    def foo(self):
        return self._foo

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

或者这样:

代码语言:javascript
复制
class A:
    def get_foo(self):
        return self._foo

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

    foo = property(get_foo, set_foo)

注意值是如何传递给setter的。不应该像你那样在那里计算。如果您需要自动评估公司价值,那么您不需要一个属性,您应该覆盖模型.save()方法,或者在那里侦听它的pre_save信号和更新字段。

第二,你不应该有条件地设置在策划人。Setter应始终将属性设置为传递的值。如下所示:

代码语言:javascript
复制
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)

如果你违反了这条规则,你就会感到悲伤:

代码语言:javascript
复制
obj.corporate = 'hi'
# obj.corporate is now 'hi'
obj.corporate = ''
# obj.corporate is still 'hi'. WTF?

第三,不应该将list分配给CharField。这是怎么回事?它可能会使它紧张。

第四,您甚至没有分配列表,而是分配queryset,更糟糕的是。

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

代码语言:javascript
复制
corporates = self.user.corporateuser_set.values_list('company', flat=True)
if corporates:
    # Stringify it explicitly and our way
    self._corporate = ','.join(corporates)
票数 2
EN

Stack Overflow用户

发布于 2013-12-09 10:28:49

这不是你使用属性的方式。 function的第一个参数,如果您那样使用它,就是getter方法。你甚至没有提供一个getter方法。您需要一个返回self._corporate值的函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20468164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档