DRF TypeError: __str__ возвращает нестроку (тип CustomUser)
Я хочу добавить в сериализатор поле, которое подсчитывает все вхождения слова (тега).
2 соответствующие модели в Models.py это:
class Tag(models.Model):
name = models.CharField(max_length=256)
language = models.CharField(max_length=256)
objects = models.Manager()
def __str__(self):
return self.name or ''
class Tagging(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True)
gameround = models.ForeignKey(Gameround, on_delete=models.CASCADE)
resource = models.ForeignKey(Resource, on_delete=models.CASCADE, related_name='taggings')
tag = models.ForeignKey(Tag, on_delete=models.CASCADE)
created = models.DateTimeField(editable=False)
score = models.PositiveIntegerField(default=0)
# media_type = models.ForeignKey(Gamemode, on_delete=models.CASCADE)
origin = models.URLField(max_length=256, blank=True, default='')
objects = models.Manager()
def __str__(self):
return str(self.tag) or ''
def save(self, *args, **kwargs):
if not self.id:
self.created = timezone.now()
return super().save(*args, **kwargs)
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(verbose_name='email address', unique=True)
username = models.CharField(max_length=256, unique=True, blank=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
first_name = models.CharField(max_length=256, null=True)
last_name = models.CharField(max_length=256, null=True)
date_joined = models.DateTimeField(editable=False, default=timezone.now)
is_superuser = models.BooleanField(default=False)
date_joined = models.DateTimeField(default=timezone.now)
is_uploader = models.BooleanField(default=False)
first_name = models.CharField(max_length=256)
last_name = models.CharField(max_length=256)
updated_at = models.DateTimeField(auto_now=True)
REQUIRED_FIELDS = ['username']
objects = CustomUserManager()
USERNAME_FIELD = 'email'
def get_username(self):
return self.username
def __str__(self):
return f'{self.email} ({self.username})' or ''
Сериализатор, который я пытаюсь написать:
class TagCountSerializer(serializers.ModelSerializer):
tag = TagSerializer(read_only=True)
tag_count = serializers.SerializerMethodField('get_tag_count')
class Meta:
model = Tagging
fields = ('id', 'tag', 'gameround', 'resource', 'tag_count')
def get_tag_count(self, obj):
# return obj.tag.all().count()
tag_count = Tagging.objects.filter(tag=obj.tag).count()
return tag_count
def to_representation(self, data):
data = super().to_representation(data)
return data
Я попробовал несколько потенциальных решений для метода get_tag_count(), включая те, которые можно увидеть здесь, но я продолжаю получать эту ошибку "Cannot query "tag name": Должен быть экземпляр "Tag"." Кто-нибудь знает, как я могу обойти это?
Вы, вероятно, должны использовать .tag
объекта, так:
def get_tag_count(self, obj):
# return obj.tag.all().count()
tag_count = Tagging.objects.filter(tag=obj.tag).count()
return tag_count
Это вернет количество Tagging
объектов, которые ссылаются на tag
, которые вы сериализуете.