SJ19
SJ19

Reputation: 2123

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

I'm trying to get all users who are employers. So what I did was I filter the users where the id can be found in the "employer" field of any (other) user. However this gives me the following error:

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

View:

# 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)
    

Model (standard stuff):

# 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;
    

I'm not sure what I'm doing wrong. Any suggestions?

Upvotes: 1

Views: 136

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477533

You can filter with an F-expression [Django-doc] to refer to another column:

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'))

This thus makes a query that looks like;

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

or you can filter the relation in reverse to get CustomUsers that employ at least one person:

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()

This constructs a query that looks like:

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

Upvotes: 1

Related Questions