我目前正在学习如何为我的公司构建API。我已经很长时间没有这么做了,所以我现在基本上都是初级开发人员。
在一些教程之后,我使用基于类的视图在基本级别上启动并运行了API。
以前,我曾经' id'作为我的几个序列化程序的字段之一。我的经理不喜欢这样,他指出它会泄露有关我们业务的潜在敏感信息(如果你的JSON得到customer_id = 13,那么如果你得到job_id = 5433,你可以推断出还有其他12个客户然后你可以推断出有5432个其他工作,等等。)
我试图找出如何添加" id"我的序列化工具'没有透露这些信息的字段,以帮助查找list_args和网址。
以前,API上的客户网址可能是www.example.com/api/customer/5,5是" pk"在数据库中,并将返回该客户的JSON数据。
我不确定如何使用pk但是以某种方式混淆它。
models.py上的客户模型
class Customer(models.Model):
company_name = models.CharField(max_length=100)
contact_name = models.CharField(max_length=100)
contact_email = models.CharField(max_length=100)
user = models.OneToOneField(User)
@staticmethod
def get_absolute_url():
return reverse('details')
def __str__(self):
return self.company_name + ', ' + self.contact_name + ' (' + .contact_email + ')'
class Meta:
unique_together=(('contact_email','user'),)
在serializers.py
上class CustomerListSerializer(ModelSerializer):
url = HyperlinkedIdentityField(
view_name='api:customer_list_detail',
lookup_field='pk'
)
delete_url = HyperlinkedIdentityField(
view_name='api:customer_list_delete',
lookup_field='pk'
)
user = SerializerMethodField()
class Meta:
model = Customer
fields = [
'id',
'url',
'company_name',
'contact_name',
'contact_email',
'user',
'delete_url'
]
def get_user(self, obj):
return str(obj.user.name)
我尝试了什么:
id = str(serializers.UUIDField(format = hex))
它只返回与以前相同的ID。我认为这是一种生成唯一数字的方法,但似乎并非如此。
我尝试使用谷歌搜索" django rest api生成唯一的ID"但是我得到了无关的结果,或者我还不够先进,无法解析结果并找到我需要的东西。正如我所提到的,我在这方面很陌生,但有很多乐趣可以解决问题!
答案 0 :(得分:1)
我不知道这是否适合您的情况,但我建议您不要混淆现有ID字段,而是可以向模型中添加另一个唯一字段:UUIDField。
这样,您可以将'uuid'传递给序列化程序而不是'id',然后使用'uuid'进行查找(因为它保证也是唯一的)。这样,您就无法显示数据量,同时仍能够执行查询。
但是,您应该注意为现有模型添加唯一字段。幸运的是,有一个关于精确地将UUIDField添加到django docs中的现有模型的示例。
希望这有帮助!