繁体   English   中英

Django Rest框架:“无效的in()文字”和一个CharField

[英]Django Rest Framework: “Invalid literal for in()” with a CharField

我正在尝试为用户收藏夹创建一个API端点。 但是,我现在遇到了一个我无法解决的问题。

POST到端点时,我得到了一个无效的CharField文字错误。

ValueError at /api/users/2/favourites/
invalid literal for int() with base 10: 'track'

这是序列化器:

class FavouriteSerializer(serializers.ModelSerializer):
    user = UserSerializer(
        read_only=True,
        default=CreateOnlyDefault(serializers.CurrentUserDefault())
    )
    type = serializers.CharField(source='content_type')
    object = FavouriteObjectRelatedField(read_only=True)
    id = serializers.IntegerField(source='object_id')

    def create(self, validated_data):
        raise TypeError(validated_data)

    class Meta:
        model = Favourites
        fields = ('type', 'object', 'user', 'type', 'id')

我通过在序列化器的to_internal_value()方法中引发异常来验证错误是由序列化器而不是视图引起的。 查看后会触发。

我已经检查了数据库,以确认没有数据错误。

可能导致错误(不确定如何)的一件事是我正在使用内容类型框架

因此,这是模型:

class Favourites(models.Model):
    objects = FavouritesManager()

    user = models.ForeignKey('Profile.User', on_delete=models.CASCADE)
    content_type = models.ForeignKey(ContentType)
    object_id = models.IntegerField()
    object = GenericForeignKey('content_type', 'object_id')
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = _('favorite')
        verbose_name_plural = _('favorites')
        unique_together = (('user', 'content_type', 'object_id'),)

错误发生在type字段上。 如果将字段更改为IntegerField并为数据使用整数,则不会出现此错误。 奇怪的是,如果我将id字段变成CharField ,也不会收到错误消息。 因此,我相信这与ContentType的外键有关,但不知道如何做。

您可以在此处查看完整的堆栈跟踪。

在这里,您有一个CharField

type = serializers.CharField(source='content_type')

content_typeContentTypeForeignKey ,其主键是整数:

content_type = models.ForeignKey(ContentType)

如果POST type=track ,Django将尝试将'track'为整数,这显然会失败。

您的类型应为:

type = serializers.IntegerField(source='content_type')

而且,如果ContentType行的idtype=5 ,则不应该POST type=track ,而应该type=track 5

在外壳上尝试此操作以获取您的内容类型的ID:

>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.all().values_list()
[
    (1, 'auth', 'user'),
    (2, 'auth', 'permission'),
    (3, 'auth', 'group'),
    (4, 'contenttypes', 'contenttype'),
    (5, 'sessions', 'session'),
    ...
    (8, 'yourapp', 'yourmodel'),
    ...
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM