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>
我正在尝试让所有用户成为雇主。 所以我所做的是过滤可以在任何(其他)用户的“雇主”字段中找到 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>