我已经为我的后端构建了一个带有React前端和Django Rest Framework(DRF(API的项目。事情进展顺利,但我很好奇根据您的模型保存数据的最佳实践。
例如,我有一个具有first_name
和last_name
字段的用户模型。我的用户和两个用户域之间存在一对一的关系(例如Buyer
和Seller
(。此外,我们在类似Product
的东西上有一个Seller
的外键关系。
在我的UI上,我有显示数据的表,通常,大多数表都显示用户的全名(first_name
+last_name
(。
一般来说,我想要通过API(例如{base_url}/product/?ordering=full_name
(过滤和排序的所有表字段。
我决定我想要从REST API返回的数据来表示表数据,所以我现在通过使用SerializerMethodField
来增强Buyer
和Seller
的串行器以具有全名来返回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_name
、last_name
和full_name
(上。这里显然有一些重复,所以我认为Django有办法在first_name
和last_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')
这是文档