#django #django-views
#django #django-представления
Вопрос:
Я сделал это в своих представлениях:
Для сериализации данных я сделал:
@login_required
@product_1_activation
def getcompanyObject(request, pk):
company_details = get_object_or_404(company, pk=pk)
all_objects = list(Company.objects.filter(pk=pk)) list(Group1.objects.filter(Company=company_details.pk)) list(Ledger1.objects.filter(Company=company_details.pk)) list(Journal.objects.filter(Company=company_details.pk))
data = serializers.serialize('json', all_objects)
data = json.dumps(json.loads(data), indent=4)
response = HttpResponse(data , content_type='application/json')
response['Content-Disposition'] = 'attachment; filename={}-{}.json'.format(company_details.Name,datetime.now())
return response
А затем я попытался:
from django.core.management import call_command
@login_required
def company_upload(request):
if request.method == 'POST':
new_company = request.FILES['myfile']
obj_generator = serializers.json.Deserializer(new_company)
for obj in obj_generator:
call_command('loaddata', obj, verbosity=0)
return render(request, 'company/import.html')
Это похоже на python manage.py loaddata
.
Но когда я пытаюсь выполнить это, я получаю следующую ошибку:
Problem installing fixture '<DeserializedObject: company': company(pk=87)> is not a known serialization format.
Кто-нибудь может сказать мне, почему это происходит?Если в моем коде есть какие-либо ошибки, пожалуйста, помогите мне исправить мои ошибки.
Спасибо
Ответ №1:
Вероятно, вам сначала потребуется сохранить файл на диск. loaddata
Команда ожидает, что аргументом будет путь к файлу fixture на диске.
Вы можете сохранить загруженный файл во временный файл, а затем вызвать loaddata
его.
Например:
import tempfile
from django.core.management import call_command
@login_required
@product_1_activation
def company_upload(request):
if request.method == 'POST':
new_company = request.FILES['myfile']
with tempfile.NamedTemporaryFile(dir='/tmp') as temp:
for chunk in new_company.chunks():
temp.write(chunk)
call_command('loaddata', '/tmp/{}'.format(temp.name), verbosity=0)
return render(request, 'company/import.html')
Комментарии:
1. Теперь он выдает мне эту ошибку
No fixture named 'tmpnxh2e_dq' found.
в этой строке кодаcall_command('loaddata', temp.name, verbosity=0)
2. Кажется, что
temp.name
в вашей системе не указан полный путь (это происходит в моей). Я обновил ответ, чтобы использовать явный каталог/tmp
— посмотрите, работает ли это.