Проблема при загрузке данных в базу данных django с использованием ‘loaddata’

#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 — посмотрите, работает ли это.