2017-07-06 32 views
2

我試圖爲我定義用戶訪問的外部組做一個API。我在django中設置了一個易於管理的設置,但我希望輸出對於其他團隊來說非常簡單。試圖製作一個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 

理想我想能夠返回查詢對象與最終Django的休息框架打得很好,因爲我喜歡它是如何很好地返回取其形式要求

編輯相同的數據: 這是我在想什麼將是接近解決方案,但我知道我正在使用類繼承不正確

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

相關問題