簡體   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