【问题标题】:django-import-export : import not workingdjango-import-export:导入不起作用
【发布时间】:2020-01-31 08:17:38
【问题描述】:

我正在尝试使用带有 django-import-export 模块的 .csv 文件填充我的数据库,但我一直在此错误中运行

Line number: 1 - maximum recursion depth exceeded while calling a Python object 43, Sicilian, L, 0, 1,7, 45.7
每当我尝试通过管理 UI 填充我的 Pizza 模型时。

这是我的 CSV

admin.py

from django.contrib.admin import ModelAdmin

from import_export.admin import ImportExportModelAdmin

from .models import Topping, Pizza, Sub, Pasta, Salad, Dinner


class PizzaAdmin(ImportExportModelAdmin):
    def save_related(self, request, form, formsets, change):
        super(PizzaAdmin, self).save_related(request, form, formsets, change)
        form.instance.toppings.add(Topping.objects.get(name='Cheese'))

@admin.register(Sub)
class SubAdmin(ImportExportModelAdmin):
    pass

# Register your models here.
admin.site.register(Topping)
admin.site.register(Pizza, PizzaAdmin)
# admin.site.register(Sub)
admin.site.register(Pasta)
admin.site.register(Salad)
admin.site.register(Dinner)

models.py

from django.contrib import admin

from django.db import models
from django.contrib.auth.models import User
from django.dispatch import receiver
from django.db.models.signals import post_save

from django.core.validators import MinValueValidator, MaxValueValidator
from django.contrib.auth import get_user_model

# Create your models here.


class Topping(models.Model):
    name = models.CharField(max_length=64)

    def __str__(self):
        return(f"{self.name}")


class Pizza(models.Model):
    PIZZA_SIZES = (
        ('S', 'Small'),
        ('L', 'Large'),
    )

    pizza_type = models.CharField(max_length=64)
    pizza_size = models.CharField(max_length=1, choices=PIZZA_SIZES)
    qty_toppings = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(3)], default=0)
    toppings = models.ManyToManyField(Topping, related_name='pizzas', blank=True)
    price = models.FloatField(help_text="Price in $")


    def __str__(self):
        return f"Size: {self.get_pizza_size_display()}, Type: {self.pizza_type}, Number of Toppings: {self.qty_toppings},  Price: {self.price}, Toppings: {self.toppings.in_bulk()}"

    def save(self, *args, **kwargs):
        # if 'toppings' not in kwargs:
        # kwargs.setdefault('force_insert', True)
        # kwargs.setdefault('force_update', True)
        super(Pizza, self).save(*args, **kwargs)
        self.toppings.add(Topping.objects.get(name='Cheese'))
        # kwargs.setdefault('toppings', Topping.objects.get(name='Cheese'))


class Sub(models.Model):
    SUBS_SIZES = (
        ('S', 'Small'),
        ('L', 'Large'),
    )

    subs_size = models.CharField(max_length=1, choices=SUBS_SIZES)
    name = models.CharField(max_length=64)
    price = models.IntegerField(help_text="Price in $")

    def __str__(self):
        return f"{self.name}, {self.get_subs_size_display()} : {self.price}"

class Pasta(models.Model):
    name = models.CharField(max_length=64)
    price = models.IntegerField(help_text="Price in $")

    def __str__(self):
        return f"{self.name} : {self.price}"


class Salad(models.Model):
    name = models.CharField(max_length=64)
    price = models.IntegerField(help_text="Price in $")

    def __str__(self):
        return f"{self.name} : {self.price}"


class Dinner(models.Model):
    DINNER_SIZES = (
        ('S', 'Small'),
        ('L', 'Large'),
    )

    dinner_size = models.CharField(max_length=1, choices=DINNER_SIZES)

    name = models.CharField(max_length=64)
    price = models.IntegerField(help_text="Price in $")

    def __str__(self):
        return f"{self.name}, {self.get_dinner_size_display()} : {self.price}"


class Euser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return(f"{self.id}")


class ShoppingCart(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
    pizzas = models.ManyToManyField(Pizza)
    subs = models.ManyToManyField(Sub)
    pastas = models.ManyToManyField(Pasta)
    dinners = models.ManyToManyField(Dinner)

    number_of_articles = models.IntegerField(null=True)
    price = models.DecimalField(max_digits=5, decimal_places=2, null=True)

    def __str__(self):
        return(f"{self.user}'s cart")

@receiver(post_save, sender=get_user_model())
def create_user_cart(sender, instance, created, **kwargs):
    if created:
        ShoppingCart.objects.create(user=instance)




# @receiver(post_save, sender=User)
# def create_user_cart(sender, instance, created, **kwargs):
#     if created:
#         ShoppingCart.objects.create(user=instance)

# @receiver(post_save, sender=User)
# def save_user_cart(sender, instance, **kwargs): 
#    instance.shoppingcart.save()

仅供参考:使用 pandas 将相同的 .csv 转换为 .json,我得到了 KeyError encountered while trying to read file: pizza_sicilian.json

任何帮助将不胜感激

【问题讨论】:

  • 两个topings (1,7) 其中分隔符是逗号?首先尝试从 43 和 38 行中删除第二个顶部,看看它是否会起作用。
  • Line number: 1 - maximum recursion depth exceeded while calling a Python object 43, Sicilian, L, 0, 1, 45.7 遇到同样的错误
  • 所以我尝试添加一个Pizza 和一个已经被占用的id,它设法更新了数据库中的行,但是如果我清空id 列或放没有被占用的随机id's,它给了我这个递归错误
  • 这一定是Pizza保存方法中的东西。我猜这条线self.toppings.add(Topping.objects.get(name='Cheese')) - 在使用add 后不会调用保存吗?这将解释错误。
  • 我认为它与Pizza's save method 无关,因为我在admin.pymodels.py 上评论了save 方法,但我仍然得到同样的错误我确实尝试为Sub 模型使用import .csv,它通过了。我正在考虑一些与m2m 相关的内部错误与Topping 模型..

标签: python django django-import-export


【解决方案1】:

我也遇到过同样的问题 我宁愿建议你

in admin .py
@admin.register(Sub)
class SubAdmin(ImportExportModelAdmin):
    list_display=["pizza","other objects in model"]
    pass

list_display 是默认功能,项目应该在列表中... 这解决了我的问题,我想它会帮助很多观众! 谢谢你!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 2015-07-17
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    相关资源
    最近更新 更多