我目前正在学习如何为我的公司构建API。我已经很长时间没有这样做了,所以目前我基本上是一个初级开发人员。

在学习了一些教程之后,我使用基于类的视图在非常基础的级别上启动并运行了API。

以前,我将“ id”作为我的多个序列化器的字段之一。我的经理不喜欢这样,他指出这会透露有关我们业务的潜在敏感信息(如果您的JSON的customer_id = 13,那么您可以推断出还有12个其他客户,如果您的job_id = 5433,那么您可以推断出还有5432个其他工作,等等)。

我试图弄清楚如何在不暴露此类信息的情况下将“ id”添加到序列化程序的字段中,以帮助lookup_args和url。

以前,API上的客户URL可能是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。我认为这是一种生成唯一编号的方法,但事实并非如此。

我尝试使用Google搜索搜索“ django rest api生成唯一ID”,但是我得到的结果不相关,或者我不够先进,无法解析结果并找到所需的内容。正如我所提到的,我对此很陌生,但是在弄清楚事情方面却有很多乐趣!

最佳答案

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

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

但是,在向现有模型添加唯一字段时应谨慎。幸运的是,有一个示例可以将UUIDField精确地添加到django docs中的现有模型。

希望这可以帮助!

关于python - Django Rest Framework:从ID字段生成唯一的混淆ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47181946/

10-16 08:43