2017-07-06 13 views
2

私はユーザーアクセスを定義する外部グループのAPIを作ろうとしています。私は管理しやすいdjangoの設定を持っていますが、他のチームにとっては出力が非常に単純になりたいです。私のモデルのように見えないジャンゴ休憩APIを作成しようとしています

{ 
    "user_list": { 
     "user": { 
      "username": "username1", 
      "top_accesses": ["top_access_1", "top_access_2", "top_access_5"], 
      "middle_accesses": ["middle_access_1", "middle_access_2", "middle_access_7"], 
      "lower_accesses": ["lower_access_1", "lower_access_2", "lower_access_22"], 
     }, 
     "user": { 
      "username": "username2", 
      "top_accesses": ["top_access_1", "top_access_2", "top_access_8"], 
      "middle_accesses": ["middle_access_3", "middle_access_5", "middle_access_6"], 
      "lower_accesses": ["lower_access_21", "lower_access_33", "lower_access_36"], 
     } 
    } 
} 

しかし、私は私のモデルからこれらのセットを思い付くORMに建てられたDjangoのを使用してトラブルを抱えている:

これは私が探しているの出力のようなものになるだろうです。私はSQLでそれを行う方法を考えることができますが、これは特にきれいな方法ではありません。 TabularInlineを使用して、私はここでは管理者ページに

を見たい正確に何を示しているので、私はそれを行うには良い方法があるに違いありません知っている私のモデルです:

class TopAccess(models.Model): 
    name = models.CharField(max_length=100) 
    site_user_access = models.ManyToManyField(User, blank=True) 
    site_group_access = models.ManyToManyField(Group, blank=True) 

    class Meta: 
     verbose_name_plural = "Top Access" 

    def __str__(self): 
     return self.name 


class MiddleAccess(models.Model): 
    name = models.CharField(max_length=100) 
    site_user_access = models.ManyToManyField(User, blank=True) 
    site_group_access = models.ManyToManyField(Group, blank=True) 

    class Meta: 
     verbose_name_plural = "Middle Access" 

    def __str__(self): 
     return self.name 


class LowerAccess(models.Model): 
    name = models.CharField(max_length=100) 
    site_user_access = models.ManyToManyField(User, blank=True) 
    site_group_access = models.ManyToManyField(Group, blank=True) 

    class Meta: 
     verbose_name_plural = "Lower Access" 

    def __str__(self): 
     return self.name 

理想的には、私は、クエリを返すことができるだろう私はそれがフォームが

編集を要求された方に同じデータを返す方法きれい好きであるため、最終的にはジャンゴ・休息・フレームワークとうまく演じているオブジェクト: これがあることを何が起こっているか、私は考えているありますソリューションに近いが、私は間違ってクラスの継承を使用している知っている

class MaybeThisCouldWork(User): 
    t_user = TopAccess.objects.filter(site_user_access=User) 
    m_user = MiddleAccess.objects.filter(site_user_access=User) 
    l_user = LowerAccess.objects.filter(site_user_access=User) 
    user_groups = User.objects.filter(id=User) 
    for user_group in user_groups: 
     t_group = TopAccess.objects.filter(
       site_group_access=user_groups 
       ) 
     m_group = MiddleAccess.objects.filter(
       site_group_access=user_groups 
       ) 
     l_group = LowerAccess.objects.filter(
       site_group_access=user_groups 
       ) 
     t_user = t_user | t_group 
     m_user = m_user | m_group 
     l_user = l_user | l_group 

答えて

2

あなたは、これは私が今それを試してみるつもりです、非常に有望に見える

class TopAccessSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = TopAccess 
     fields = ['name'] 

class MiddleAccessSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = MiddleAccess 
     fields = ['name'] 

class LowerAccessSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = LowerAccess 
     fields = ['name'] 


class UserSerializer(serializers.ModelSerializer): 
    topaccess = TopAccessSerializer(source='topaccess_set', many=True) 
    middleaccess = MiddleAccessSerializer(source='middleaccess_set', many=True) 
    loweraccess = LowerAccessSerializer(source='loweraccess_set', many=True) 

    class Meta: 
     model = User 
     fields = ['username', 'topaccess', 'middleaccess', 'loweraccess'] 
+0

、このようなものであってもよいし、シリアライザを使用することができます。私はそれがどのように進むのかを知らせます。ありがとう! – joedurbak

+0

本物の魔法は「loweraccess_set」プロパティです。私はそれが(私はかなりdjangoに新しい)存在しているか分からなかった。それが私が探していた正確なパラメータです。本当にありがとう! – joedurbak

+0

これは、django ForeignKeyリレーションの逆引きアクセッサです。あなたはここのドキュメントでそれらを参照することができます.. https://docs.djangoproject.com/en/1.11/topics/db/queries/#following-relationships-backward – zaidfazil

関連する問題