我正在努力使用ForeignKey
在Django中填充models
。假设我们有**import_export**文档中的以下示例:
class Author(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Category(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField('Book name', max_length=100)
author = models.ForeignKey(Author, blank=True, null=True, )
...
price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
categories = models.ManyToManyField(Category, blank=True)
def __str__(self):
return self.name
我如何实现import_export
模块,该模块可以通过名称(而不是ID)检查是否存在一个现有的作者,该模块不区分大小写,并且可以在作者不存在的情况下生成一个新的作者?
例如,假设CSV文件如下所示:
name,author,...,price,categories
J.R.R. Tolkien,Lord of the Rings,...,40,["cat1","cat2"]
另外,如果存在DateTime
字段,如何在ForeignKey
表中生成该字段?
**注意:**我知道自然密钥的用法:
from import_export.fields import Field
from import_export.widgets import ForeignKeyWidget
class AuthorManager(models.Manager):
def get_by_natural_key(self, name):
return self.get(name=name)
class Author(models.Model):
objects = AuthorManager()
name = models.CharField(max_length=100)
birthday = models.DateTimeField(auto_now_add=True)
def natural_key(self):
return (self.name,)
# Only the author field uses natural foreign keys.
class BookResource(resources.ModelResource):
author = Field(
column_name = "author",
attribute = "author",
widget = ForeignKeyWidget(Author, use_natural_foreign_keys=True)
)
class Meta:
model = Book
但是我不知道如何检查CSV中的UPPER
或lower
情况,以及如果不存在,如何生成新的Author
。
1条答案
按热度按时间bzzcjhmw1#
如果FK关系尚不存在,有几种方法可以在导入过程中创建FK关系。
选项1 -覆盖
before_import_row()
方法选项2 -子类
ForeignKeyWidget
只需将
ForeignKeyWidget
子类化并在clean()
中实现检查:无论哪种方式都行。我个人会使用选项2。
另外,如果有DateTime字段,如何在ForeignKey表中生成?
由于您正在调用
Author.objects.get_or_create()
,因此可以根据需要添加日期,例如:如果使用自然关键点,则可以根据需要调整代码。
Related answer about creating in bulk mode