2017-11-08 4 views
0

私は現在、自分の会社のAPIを構築する方法を学んでいます。私は非常に長い間これをやっていないので、私は基本的には現時点ではジュニア開発者です。Django Rest Framework:IDフィールドから一意の難読化IDを生成

いくつかのチュートリアルに続いて、私は自分のAPIをクラスベースのビューを使って非常に基本的なレベルで稼働させました。

以前、私はいくつかのシリアライザのフィールドの1つとして「id」を持っていました。私のマネージャーはこれが好きではなく、ビジネスに関する機密情報を明らかにすると指摘しました(JSONのcustomer_id = 13になったら、他の12人の顧客がいると推測できます。 5432の他の仕事などがあると推測することができます)。

シリアライザのフィールドに「id」を追加する方法を理解しようとしていますが、lookup_argsとurlsの助けになります。

以前は、APIの顧客のURLはwww.example.com/api/customer/5でした.5はデータベースの「pk」で、その顧客のJSONデータが返されます。

私はpkを使用する方法についてはわかりませんが、何とかそれを難読化しています。

ID = STR(serializers.UUIDField(フォーマット=進))

:私が試した何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) 

で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'),) 

カスタマー・モデル

これまでと同じIDを返したところです。私はそれが一意の数字を生成する方法だと思ったが、そうではないようだ。

私は「django rest api unique IDを生成する」の検索を試みましたが、無関係な結果が得られています。または、結果を解析して必要なものを見つけるのに十分に進んでいません。私が言及したように、私はこれでは非常に新しいですが、物事を理解するのが楽しいです!

答えて

1

これがあなたのケースのオプションかどうかわかりませんが、既存のIDフィールドを難読化する代わりに、モデルに別の一意のフィールドを追加することもできます:UUIDField

このようにして、 'id'ではなく 'uuid'をシリアライザに渡してから、 'uuid'を使用して検索することができます(ユニークであることが保証されているため)。この方法では、依然としてクエリを実行できる間にデータの量を明らかにすることはありません。

既存のモデルにユニークなフィールドを追加することには注意が必要です。幸い、django docsの既存のモデルにUUIDFieldを正確に追加する例があります。

希望すると便利です。

関連する問題