2016-12-14 19 views
1

在我的模型中,用戶與其Profile具有公司關聯。爲了序列化它們,我希望如果發出請求的用戶是__staff,那麼序列化程序必須返回所有公司,而不僅僅是他/她通過模型中的關係進行的。DRF - ModelSerializer中的過濾器

什麼是......的正確方法:

1)檢查用戶是否是職員。
2)如果用戶是員工或退還與用戶相關的配置文件的公司,則退回所有公司。

我想對付它的最好方法將在被檢查BProfileSerializerRelated如果用戶是員工,然後添加這樣的事情:

company = serializers.SerializerMethodField('get_companies') 

    def get_companies(self, obj): 
     companies = Company.objects.all() 
     serializer = CompanySerializer(instance=companies, many=True) 
     return serializer.data 

我當前的代碼不考慮如果用戶的工作人員這樣只返回與用戶相關的公司:

models.py

class BUser(AbstractBaseUser, PermissionsMixin): 
    username = models.CharField(max_length=40, unique=True) 
    first_name = models.CharField(max_length=40) 
    last_name = models.CharField(max_length=40) 


class BProfile(models.Model): 
    user = models.ForeignKey('BUser') 
    company = models.ForeignKey('BCompany') 
    groups = models.ManyToManyField(Group) 

class BCompany(models.Model): 
    name = models.CharField(max_length=64) 
    dealer = models.ForeignKey(BProfile, related_name='companies', blank=True, null=True) 

views.py

@api_view(['GET']) 
def current_user_detail(request): 
    serializer = BUserSerializerRelated(request.user) 
    return Response(serializer.data) 

serializers.py

class BUserSerializerRelated(serializers.ModelSerializer): 
    bprofile_set = BProfileSerializerRelated(many=True) 

    class Meta: 
     model = BUser 
     fields = ('id', 'bprofile_set', 'username', 'email', 'first_name', 'last_name') 

class BProfileSerializerRelated(serializers.ModelSerializer): 
    company = CompanySerializer() 
    groups = GroupSerializer(many=True) 
    dealer_companies = CompanySerializer(many=True) 

    class Meta: 
     model = BProfile 
     fields = ('id', 'dealer_companies', 'company', 'groups') 


class CompanySerializer(serializers.ModelSerializer): 
    sites = SiteSerializer(many=True) 
    services = ServiceSerializer(many=True) 

    class Meta: 
     model = Company 
     fields = ('id', 'dealer','name', 'cif', 'sites', 'services') 

回答

1

串行已經在他的語境字典request對象。所以你可以從那裏得到當前用戶。

def get_companies(self, obj): 
    user = self.context['request'].user 
    if user.is_staff: 
     serializer = CompanySerializer(Company.objects.all(), many=True) 
    else: 
     serializer = CompanySerializer(instance=companies, many=True) 
    return serializer.data 
0

要訪問請求對象的序列化,你需要通過它的上下文字典,而初始化串行即在views.py

serializer = BUserSerializerRelated(request.user, context={'request': self.request}) 

然後在serializers.py,您可以訪問請求的用戶對象像

user = self.context['request'].user