При отправке запроса 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
, как и ожидалось. ЕДИНСТВЕННАЯ РАЗНИЦА похоже, что я тоже пытаюсь загрузить файл с этой конечной точкой.
Мне кажется, что я что-то упустил, но понятия не имею, что это такое.