如何覆盖Django中特定列的对象点访问?

时间:2019-04-26 10:42:19

标签: python django

说我有一个经过过滤的Django对象,

details_obj = DetailsTable.objects.get(user_name='nap')

details_obj.user_name
'nap'

details_obj.city
'Paris'

details_obj.age
22

现在我要做的是覆盖对特定列的访问,以实现以下目的:

# if a new city exists in a different table
if updated_city_exists:
    # return the updated city instead
    return 'London'
else:
    # the usual flow that currently exists in Django
    return obj.city 

# is user accesses city like
details_obj.city
'London' 
# London returned here as updated city exists for this user

我无法真正修改现有DetailsTable的模型,因为它是已经使用了很多次的预先存在的代码。

代码中还有很多地方已经开始进行城市点访问。因此,我想重写现有方法来访问列值。

我也不想更新现有city列中的DetialsTable列。

反正我能做到吗?我唯一想到的就是编写一个函数,如果该函数存在,它将返回更新的city,并在任何地方使用此函数,但是如果这样做,我将不得不替换很多现有的代码。

1 个答案:

答案 0 :(得分:0)

在您的模型中

@property
def updated_city(self):
    # if a new city exists in a different table
    if updated_city_exists:
        # return the updated city instead
        return 'London'
    # the usual flow that currently exists in Django
    return obj.city

现在details_obj.updated_city将根据您在def updated_city中的逻辑返回城市。