【问题标题】:Django REST: queryset error type error int() must be a stringDjango REST:查询集错误类型错误 int() 必须是字符串
【发布时间】:2020-07-23 19:29:17
【问题描述】:

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

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

【问题讨论】:

  • 您在id 中传递的内容是发生错误的地方。我的意思是intobject
  • @PruthviBarot:内置id函数:docs.python.org/3/library/functions.html#id
  • @PruthviBarot 的自定义用户 ID。所以int。

标签: django django-rest-framework django-queryset


【解决方案1】:

您可以使用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(employer=F('pk'))

这使得查询看起来像;

SELECT customuser.*
FROM customuser
WHERE customuser.employer = customuser.id

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

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

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

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

SELECT DISTINCT customuser.*
FROM customuser
JOIN customuser u2 ON u2.employer = customuser.id

【讨论】:

  • 感谢您的回答,但我认为此查询不正确?如果我错了,请纠正我,但我认为此查询选择他们的雇主与其 ID 相同的自定义用户。所以你只得到他们自己雇主的用户?而我只是想要所有雇主。
  • @SJ19:在这种情况下是后者。问题是,雇主的雇员是什么?我会认为它指的是它自己。但是第二个查询列出了所有CustomUsers,这些CustomUsers 至少有一个CustomUser 将它们作为employer
  • 雇主没有雇主 (null) :)。第二个查询有效!但老实说,我不知道你在这里做什么,愿意解释一下吗?就像 customuser__isnull=False 做了什么,有什么不同?似乎没有任何关于我没有得到的雇主字段的参考。
  • @SJ19: 不,但是将其链接到自己可能会更优雅,因为那时它不是NULLable 字段,因此在层次结构中“向上”移动更优雅.无论如何,后者应该产生至少有一名员工的customusers。
  • @SJ19:这意味着我们在employer 关系上反向连接LEFT OUTER,并且由于__isnull=False 过滤器,因此它是一个简单的INNER JOIN.distinct() 是必需的,否则我们将多次返回相同的CustomUser,每个员工一个。
猜你喜欢
  • 2018-04-24
  • 2019-12-24
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 2022-12-14
相关资源
最近更新 更多