【问题标题】:Foreign Key Not Setting On CSV Upload -- DjangoCSV 上传时未设置外键——Django
【发布时间】:2017-08-16 17:41:24
【问题描述】:

将 csv 导入 django 时,未设置外键。可能代码可能是错误的。我可以导入外键,但无法在产品对象中设置它们。

我不想手动设置外键。

型号

from django.db import models
from django.core.urlresolvers import reverse
from django.template.defaultfilters import slugify

# Create your models here.
class Category(models.Model):
    parent = models.ForeignKey('self', blank=True, null=True)
    category_name = models.CharField(max_length=250, blank=True)
    slug = models.SlugField(max_length=250, unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.category_name)
        super(Category, self).save(*args, **kwargs)

    #def get_absolute_url(self):
        #return reverse('products:category', args=[self.id]) #kwargs={'slug': self.slug}

    def __str__(self):
        return self.category_name

class Company(models.Model):
    company_name = models.CharField(max_length=500)
    company_url = models.URLField(max_length=1000, blank=True)
    slug = models.SlugField(max_length=500)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.company_name)
        super(Company, self).save(*args, **kwargs)

    #def get_absolute_url(self):
        #return reverse('products:category', args=[self.id]) #kwargs={'slug': self.slug}

    def __str__(self):
        return self.company_name

class Manufacturer(models.Model):
    manufacturer_name = models.CharField(max_length=500)
    slug = models.SlugField(max_length=500)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.manufacturer_name)
        super(Manufacturer, self).save(*args, **kwargs)

    #def get_absolute_url(self):
        #return reverse('products:category', args=[self.id]) #kwargs={'slug': self.slug}

    def __str__(self):
        return self.manufacturer_name

class Product(models.Model):
    product_name = models.CharField(max_length=500, blank=True)
    product_description = models.TextField(blank=True)
    company = models.ForeignKey(Company, blank=True, null=True)
    category = models.ForeignKey(Category, blank=True, null=True)
    manufacturer = models.ForeignKey(Manufacturer)
    buy_link = models.URLField(max_length=1000, blank=True)
    product_image_url = models.URLField(max_length=1000, blank=True)
    price = models.CharField(max_length=30, blank=True)
    orginal_price = models.CharField(max_length=30, blank=True)
    stock = models.CharField(max_length=30, blank=True)
    sku = models.CharField(max_length=250, blank=True)
    slug = models.SlugField(max_length=500, unique=True)
    date_added = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)

    def save(self, *args, **kwargs):
        self.slug = slugify("{obj.product_name}-{obj.id}".format(obj=self))
        super(Product, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('products:product_detail', args=[self.slug]) #kwargs={'slug': self.slug}

    def __str__(self):
        return self.product_name

观看次数

def upload(request):
    if not request.user.is_authenticated:
        return redirect("home")

    csv_path = os.path.dirname(os.path.abspath(__file__))
    try:
        with open(csv_path + '/product.csv') as f:
            reader = csv.reader(f)
            for row in reader:
                _, created = Product.objects.get_or_create(
                    product_name=str(row[0]),
                    buy_link=str(row[2]),
                    product_image_url=str(row[3]),
                    price=str(row[4]),
                    orginal_price=str(row[5]),
                    product_description=str(row[6]),
                    stock=str(row[7]),
                    sku=str(row[10]),
                )
                _, created = Company.objects.get_or_create(
                    company_name=str(row[1]),
                )

                _, created = Manufacturer.objects.get_or_create(
                    manufacturer_name=str(row[8]),
                )

                _, created = Category.objects.get_or_create(
                    category_name=str(row[9]),
                )
        success = "Added to database"
        context = {"success": success}

    except csv.Error as e:
        print(e)
        context = {'error': e}

    template = "products/add.html"

    return render(request, template, context)

【问题讨论】:

  • 我的想法是,如果创建了一家公司,您应该将该公司的主键插入到产品表中。那么在产品的.get_or_create()之前不需要做公司的.get_or_create()吗?
  • 我要试一试。没想到这样
  • 试一试没有用。谢谢
  • 少了一种方法!
  • 如何保存(提交=假)。我不完全确定我应该如何写它

标签: python django csv


【解决方案1】:

下面是我认为你需要做的一个例子:

def upload(request):
    if not request.user.is_authenticated:
        return redirect("home")

    csv_path = os.path.dirname(os.path.abspath(__file__))
    try:
        with open(csv_path + '/product.csv') as f:
            reader = csv.reader(f)
            for row in reader:
                category_obj, created = Category.objects.get_or_create(
                    category_name=str(row[9]),
                )

                company_obj, created = Company.objects.get_or_create(
                    company_name=str(row[1]),
                )

                manufacturer_obj, created = Manufacturer.objects.get_or_create(
                    manufacturer_name=str(row[8]),
                )

                product_obj, created = Product.objects.get_or_create(
                    product_name=str(row[0]),
                    company=company_obj,
                    category=category_obj,
                    manufacturer=manufacturer_obj,
                    buy_link=str(row[2]),
                    product_image_url=str(row[3]),
                    price=str(row[4]),
                    orginal_price=str(row[5]),
                    product_description=str(row[6]),
                    stock=str(row[7]),
                    sku=str(row[10]),
                )

        success = "Added to database"
        context = {"success": success}

    except csv.Error as e:
        print(e)
        context = {'error': e}

    template = "products/add.html"

    return render(request, template, context)

【讨论】:

  • 我现在遵循了你的代码,我得到了一个无效的 int() 文字,基数为 10: '123 REFILLS' 这将在公司字段上。
  • 啊我忘了 Django 有一个自动的id 字段。这就说得通了。我已经更新了代码。
  • 该死的以为就是这样,但我现在明白了:无法分配“1”:“Product.company”必须是“Company”实例。
猜你喜欢
  • 2018-08-17
  • 2020-10-04
  • 2021-06-15
  • 2013-10-02
  • 2013-03-06
  • 2016-02-06
  • 2011-02-20
  • 2017-10-07
  • 2011-04-15
相关资源
最近更新 更多