Django аннотирует другие атрибуты модели на основе общего поля

У меня есть модель пользователя,

class User(AbstractBaseUser):
    id = models.IntegerField(primary_key=True)
    email = models.EmailField(unique=True)

У меня есть еще одна модель с именем Company. Модель Company имеет ссылку на модель User через поле Integer.

class Company(models.Model):
    user_id = models.IntegerField(db_index=True)
    name = models.CharField(max_length=100)
    size = models.IntegerField(default=1)

Я хочу извлечь информацию о компании вместе с информацией о пользователе. В основном я хочу получить словарь объектов пользователя следующим образом {'id':1, 'email':'abc@gmail.com','name':'foobar.co','size':400}

Я хочу аннотировать пользовательские объекты именем и размером. На данный момент я пытался сделать это в методе to_representation сериализатора. Однако для миллионов пользователей это очень медленно.

class UserSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    email = serializers.EmailField(read_only=True)

    def to_representation(self, instance):
            response = super(UserSerializer, self).to_representation(instance)
            company = Company.objects.filter(user_id=instance.id)
            if company.exists():
                company = company.first()
                response['name'] = company.name
                response['size'] = company.size
            return response

Как я могу добиться этой аннотации в самом запросе.

Если ссылки в комментарии не помогут вам, вы можете использовать SerializerMethodField для имени и размера

class UserSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    email = serializers.EmailField(read_only=True)
    name = serializers.SerializerMethodField()
    size = serializers.SerializerMethodField()
    
    def get_name(self, obj):
        # get name from DB using the User object(obj)
        return name

    def get_size(self, obj):
        # get size from DB using the User object(obj)
        return size 
Вернуться на верх