Проблема с загрузкой данных в базу данных django с использованием «loaddata» - PullRequest
0 голосов
/ 11 апреля 2019

Я сделал это в моих представлениях:

Чтобы сериализовать данные, которые я сделал:

@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 Ответ

0 голосов
/ 12 апреля 2019

Возможно, вам сначала нужно сохранить файл на диск.Команда loaddata ожидает, что аргумент будет являться путем к файлу фикстуры на диске.

Вы можете сохранить загруженный файл во временный файл, а затем вызвать 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')
...