【问题标题】:DRF TypeError: __str__ returned non-string (type CustomUser)DRF TypeError:__str__ 返回非字符串(CustomUser 类型)
【发布时间】:2022-01-07 16:00:49
【问题描述】:

我想在序列化程序中添加一个字段,该字段对单词(标签)的所有出现次数进行计数。

Models.py 中的 2 个相关模型是:

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() 方法尝试了几种可能的解决方案,包括此处可见的解决方案,但我不断收到此错误“无法查询“标签名称”:必须是“标签”实例。” 有谁知道我该如何解决这个问题?

【问题讨论】:

  • 分享完整的错误回溯

标签: python django rest django-rest-framework


【解决方案1】:

你可能应该使用对象的.tag,所以:

def get_tag_count(self, obj):
    # return obj.tag.all().count()
    tag_count = Tagging.objects.filter(tag=obj.tag).count()
    return tag_count

这将返回引用您正在序列化的tag 的Tagging 对象的数量。

【讨论】:

  • 我做了,我得到 TypeError: str returned non-string (type CustomUser)
  • @CarinaTheBookworm:这可能不是由于序列化程序,您的CustomUser 模型可能有问题。你能分享那个模型和完整的追溯吗?请编辑问题。
  • 我现在更新了。它还说“模板渲染期间出错”
  • @CarinaTheBookworm:是的,但问题在于您的CustomUser 模型。你能在问题中分享这个吗?
  • 我已经添加了。
猜你喜欢
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 2021-02-16
相关资源
最近更新 更多