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