Запросы и Django, "Неверный тип. Ожидаемое значение pk, получено InMemoryUploadedFile" при загрузке файла - PullRequest
0 голосов
/ 25 октября 2018

При отправке запроса API (Django 1.11) с помощью requests я не могу выполнить успешный запрос POST, который содержит как файл, так и ForeignKey в теле.

urls.py

urlpatterns = [
    ....
    url(r'^dataset/visual$', api_views.VisualList.as_view(), name='api-visual'),
    ....

]

models.py

class Visual(models.Model):

    class Meta:
        verbose_name_plural = "Visuals"

    name = models.CharField(max_length=30)
    description = models.CharField(max_length=75, blank=True, null=True)
    visual = models.FileField(upload_to='visuals/')
    uploaded_at = models.DateTimeField(auto_now_add=True)
    document = models.ForeignKey(Document) <--- LOOK HERE

    def __unicode__(self):
        return self.name

views.py

class VisualList(generics.ListCreateAPIView):
    parser_classes = (MultiPartParser, FormParser, FileUploadParser)
    queryset = Visual.objects.all()
    serializer_class = VisualSerializer


class VisualDetail(generics.RetrieveUpdateDestroyAPIView):
    parser_classes = (MultiPartParser, FormParser)
    queryset = Visual.objects.all()
    serializer_class = VisualSerializer

serializers.py

class VisualSerializer(serializers.ModelSerializer):
    class Meta:
        model = Visual
        fields = '__all__'

my_requests.py

response = requests.request(
    'POST',
    'http://127.0.0.1/api/dataset/visual',
    files={'name': 'Hello World', 'description': 'from API', 'document': 5,
           'visual': ('hello_world.html', open('HELLOWORLD.html', 'rb'))})

Когда я установил document = models.ForeignKey(Document, <strong>null=True</strong>) in models.py , и я удаляю ключ document из параметра files, я могу загрузить файл очень хорошо.

Однако, когда я включаю document иэто обязательное поле, я получаю сообщение об ошибке:

"Incorrect type. Expected pk value, received InMemoryUploadedFile"

Это определенно выглядит так, как будто я передаю правильный тип для pk как целое число document, которое определенно существует.У меня есть другие модели, ссылающиеся на document как на ForeignKey, и я могу сделать API POST с целочисленным значением для ключа document, как и ожидалось. ЕДИНСТВЕННАЯ РАЗНИЦА похоже, что я тоже пытаюсь загрузить файл с этой конечной точкой.

Мне кажется, что я что-то упустил, но понятия не имею, что это такое.

1 Ответ

0 голосов
/ 25 октября 2018

Похоже, вы не отправляете данные формы таким образом.Для отправки данных вместе с файлами их необходимо разделить:

response = requests.request(
    'POST',
    'http://127.0.0.1/api/dataset/visual',
    data={
        'name': 'Hello World',
        'description': 'from API',
        'document': 5,
    },
    files={
        'visual': ('hello_world.html', open('HELLOWORLD.html', 'rb')),
    }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...