Django: manage.py loaddata возвращает 'Ошибка десериализации' - PullRequest
1 голос
/ 29 октября 2019

Поэтому, когда я пытаюсь загрузить данные в мои модели из моего файла .json из cmd, он выдает мне эту ошибку: enter image description here

Кажется, проблема в'category_id', но я не уверен, как мне решить эту проблему.

Вот мой код:

shop / models.py

from django.db import models
from django.urls import reverse


# Create your models here.
class Category(models.Model):
    name = models.TextField()  
    products = models.ManyToManyField('Product')

    def get_products(self):
        return Product.objects.filter(category=self)

    def __str__(self):
        return self.name 

    def get_absolute_url(self):
        return reverse('product_list_by_category',args=[self.id])


class Product(models.Model):
    name = models.TextField()
    description = models.TextField()
    stock = models.IntegerField()
    price = models.DecimalField(max_digits=10,decimal_places=2)
    image = models.ImageField(upload_to='images/', blank=True)

    def __str__(self):
        return self.name

shop/views.py

from django.shortcuts import render, get_object_or_404, redirect
from .models import Category, Product
from django.db.models import Count
from django.contrib.auth.models import Group, User
from django.core.paginator import Paginator, EmptyPage, InvalidPage

def product_list(request, category_id=None):
    category = None
    products = Product.objects.all()
    ccat = Category.objects.annotate(num_products=Count('products'))
    if category_id:
        category = get_object_or_404(Category, id=category_id)
        products = products.filter(category=category)
    paginator = Paginator(products, 3)
    try:
        page = int(request.GET.get('page', 1))
    except:
        page = 1
    try:
        products = paginator.page(page)
    except(EmptyPage, InvalidPage):
        products = paginator.page(paginator.num_pages)

    return render(request, 'products.html',
                    {'products': products,
                    'countcat':ccat})

И это два файла .json, которые я хочу загрузить в свою базу данных (стоит отметить, что createcategories.json работал без проблем)

createcategories.json

[
    {
        "model": "shop.category",
        "pk": 1,
        "fields": {
            "name": "Europe"
        }
    },
    {
        "model": "shop.category",
        "pk": 2,
        "fields": {
            "name": "North America"
        }
    },
    {
        "model": "shop.category",
        "pk": 3,
        "fields": {
            "name": "South America"
        }
    },
    {
        "model": "shop.category",
        "pk": 4,
        "fields": {
            "name": "Asia"
        }
    },
    {
        "model": "shop.category",
        "pk": 5,
        "fields": {
            "name": "Africa"
        }
    },
    {
        "model": "shop.category",
        "pk": 6,
        "fields": {
            "name": "Middle East"
        }
    }
]

I thought that the category_id would get added automatically as a foreign key bu it has not.

Many thanks in advance!


createproducts.json

[
    {
      "model": "shop.product",
      "pk": 1,
      "fields": {
        "category_id":1,
        "name": "Europe Title 1",
        "description": "Europe Description 1",
        "stock": 3,
        "price": 100.00
        }
    },
    {
        "model": "shop.product",
        "pk": 2,
        "fields": {
          "category_id":2,
          "name": "North America Title 1",
          "description": "North America Description 1",
          "stock": 4,
          "price": 7.00
          }
      },
      {
        "model": "shop.product",
        "pk": 3,
        "fields": {
          "category_id":3,
          "name": "South America Title 1",
          "description": "South America Desc 1",
          "stock": 100,
          "price": 2.00
          }
      },
      {
        "model": "shop.product",
        "pk": 4,
        "fields": {
          "category_id":4,
          "name": "Asia Title 1",
          "description": "Asia Desc 1",
          "stock": 50,
          "price": 1.00
          }
      },
      {
        "model": "shop.product",
        "pk": 5,
        "fields": {
          "category_id":5,
          "name": "Africa Title 1",
          "description": "Africa Desc 1",
          "stock": 9,
          "price": 99.00
          }
      },
      {
        "model": "shop.product",
        "pk": 6,
        "fields": {
          "category_id":4,
          "name": "Asia Title 2",
          "description": "Asia Desc 2",
          "stock": 1,
          "price": 50.00
          }
      },
      {
        "model": "shop.product",
        "pk": 7,
        "fields": {
          "category_id":1,
          "name": "Europe Title 2",
          "description": "Europe Desc 2",
          "stock": 2,
          "price": 300.00
          }
      },
      {
        "model": "shop.product",
        "pk": 8,
        "fields": {
          "category_id":4,
          "name": "Asia Title 3",
          "description": "Asia Desc 3",
          "stock": 2,
          "price": 75.00
          }
      },
      {
        "model": "shop.product",
        "pk": 9,
        "fields": {
          "category_id":6,
          "name": "Middle East Title 1",
          "description": "Middle East Desc 1",
          "stock": 1,
          "price": 50.00
          }
      },
      {
        "model": "shop.product",
        "pk": 10,
        "fields": {
          "category_id":6,
          "name": "Middle East Title 2",
          "description": "Middle East Desc 1",
          "stock": 2,
          "price": 15.00
          }
      }
]

1 Ответ

2 голосов
/ 29 октября 2019

Вместо category_id в createproducts.json, вы должны иметь products в createcategories.json.

Я предполагаю, что при создании дампа существовало отношение ForeignKey из Product до Category, но теперь существует отношение ManyToMany от Category до Product.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...