在Django模型中存储重复数据的最佳做法是什么,比如名字、姓氏和全名



我已经为我的后端构建了一个带有React前端和Django Rest Framework(DRF(API的项目。事情进展顺利,但我很好奇根据您的模型保存数据的最佳实践。

例如,我有一个具有first_namelast_name字段的用户模型。我的用户和两个用户域之间存在一对一的关系(例如BuyerSeller(。此外,我们在类似Product的东西上有一个Seller的外键关系。

在我的UI上,我有显示数据的表,通常,大多数表都显示用户的全名(first_name+last_name(。

一般来说,我想要通过API(例如{base_url}/product/?ordering=full_name(过滤和排序的所有表字段。

我决定我想要从REST API返回的数据来表示表数据,所以我现在通过使用SerializerMethodField来增强BuyerSeller的串行器以具有全名来返回full_name,如下所示:

full_name = serializers.SerializerMethodField()

...

def get_full_name(self, obj) -> str:
return obj.user.get_full_name()

然而,我也需要在所有我想显示Buyer/Seller的地方执行此操作,其中它们被外键引用。

假设我们在Product中需要它,我会有这样的东西:

seller_first_name = serializers.CharField(source='seller.user.first_name')
seller_last_name = serializers.CharField(source='seller.user.last_name')
seller_full_name = serializers.SerializerMethodField()
...

def get_seller_full_name(self, obj) -> str:
return obj.seller.user.get_full_name()

我想我很好奇是否最好将所有这些字段直接存储在用户对象(first_namelast_namefull_name(上。这里显然有一些重复,所以我认为Django有办法在first_namelast_name的基础上自动编写full_name,而不需要在API中传递。

我相信这两种方式都可以,但这是我第一个使用DRF作为后端的项目,我宁愿现在听听别人的经验,也不愿在一年后自学,以后必须进行大规模重构

谢谢你提前给我的建议。

一切顺利,

Brandon

您可以在模型中定义一个属性:

class YourModel(models.Model):
...
@property
def full_name(self):
return f'{self.first_name} {self.last_name}'

然后,您可以使用source关键字参数在任何序列化程序中访问它:

full_name = serializers.CharField(source='YourModel.full_name')

这是文档

最新更新