Django REST:查询集错误类型错误 int() 必须是字符串

Django REST: queryset error type error int() must be a string

我正在尝试让所有用户成为雇主。 所以我所做的是过滤可以在任何(其他)用户的“雇主”字段中找到 ID 的用户。 然而,这给了我以下错误:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'builtin_function_or_method'

查看:

# Get all employers
class Employers(viewsets.ModelViewSet):
    queryset = CustomUser.objects.all()
    serializer_class = CustomUserSerializer

    def list(self, request):
        #queryset = CustomUser.objects.all();
        queryset = self.queryset.filter(id__in=CustomUser.objects.filter(employer=id))    #this gives me an error
        serializer = CustomUserSerializer(queryset, many=True)
        return Response(serializer.data)
    

型号(标准东西):

# CustomUser model
class CustomUser(AbstractBaseUser):
    username = None
    email = models.EmailField(verbose_name='email address', max_length=255, unique=True)
    date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    employer = models.ForeignKey("self", blank=True, null=True, on_delete=models.DO_NOTHING)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = MyUserManager()

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(selfself, app_label):
        return True;
    

我不确定我做错了什么。有什么建议吗?

您可以使用 F-expression [Django-doc] 进行过滤以引用另一列:

from django.db.models import F

class Employers(viewsets.ModelViewSet):
    queryset = CustomUser.objects.all()
    serializer_class = CustomUserSerializer

    def get_queryset(self, *args, **kwargs):
        return CustomUser.objects.filter(<b>employer=F('pk')</b>)

这使得查询看起来像;

SELECT customuser.*
FROM customuser
WHERE <b>customuser.employer = customuser.id</b>

或者您可以反向过滤关系以获得 CustomUser 雇用至少一个人的人:

class Employers(viewsets.ModelViewSet):
    queryset = CustomUser.objects.all()
    serializer_class = CustomUserSerializer

    def get_queryset(self, *args, **kwargs):
        return CustomUser.objects.filter(<b>customuser__isnull=False</b>)<b>.distinct()</b>

这构建了一个如下所示的查询:

SELECT DISTINCT customuser.*
FROM customuser
JOIN customuser u2 ON <b>u2.employer = customuser.id</b>