Django Rest Framework:从ID字段

时间:2017-11-08 14:13:33

标签: python json django rest django-rest-framework

我目前正在学习如何为我的公司构建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"但是我得到了无关的结果,或者我还不够先进,无法解析结果并找到我需要的东西。正如我所提到的,我在这方面很陌生,但有很多乐趣可以解决问题!

1 个答案:

答案 0 :(得分:1)

我不知道这是否适合您的情况,但我建议您不要混淆现有ID字段,而是可以向模型中添加另一个唯一字段:UUIDField

这样,您可以将'uuid'传递给序列化程序而不是'id',然后使用'uuid'进行查找(因为它保证也是唯一的)。这样,您就无法显示数据量,同时仍能够执行查询。

但是,您应该注意为现有模型添加唯一字段。幸运的是,有一个关于精确地将UUIDField添加到django docs中的现有模型的示例。

希望这有帮助!