通过 Django 中的 Fixtures 使用 YAML 文件填充数据库中的数据

问题描述

我正在尝试为 class SuperUserMan: UserMan 模型填充数据库中的数据 另外,我不会使用外键 ID,如下所示

示例 1:

object

相反,我将使用各自模型的唯一值,如下所示

示例 2:

Employee

models.py 文件

- model: employee.employee
  pk: 1
  fields: 
    user: 1
    manager: NULL
    department: 1
    job_level: 5
    created_at: '2021-06-03'
    updated_at: '2021-06-03'

让我们考虑示例 2 我将像示例 2 那样填充数据 这样做

我们可以使用 - model: employee.employee pk: 1 fields: user: [manager.finance] manager: NULL department: [Finance] job_level: [MNGR] created_at: '2021-06-03' updated_at: '2021-06-03' 模型中的 from django.db import models from django.conf import settings from django.db.models import Q class TimestampedModel(models.Model): created_at = models.DateField(auto_Now_add=True) updated_at = models.DateField(auto_Now=True) class Meta: abstract = True class DepartmentManager(models.Manager): def get_by_natural_key(self,name): return self.get(name=name) class Department(TimestampedModel): name = models.CharField(max_length=128,unique=True) objects = DepartmentManager() class Meta: db_table = 'tc_departments' def __str__(self): return f'{self.name}' class JobLevelManager(models.Manager): def get_by_natural_key(self,handle): return self.get(handle=handle) class JobLevel(models.Model): handle = models.CharField(max_length=32,unique=True) display_name = models.CharField(max_length=64,null=True,blank=True) objects = JobLevelManager() class Meta: db_table = 'tc_job_levels' def __str__(self): return f'{self.handle} and {self.display_name}' class EmployeeManager(models.Manager): def get_by_natural_key(self,user): return self.get(user=user) class Employee(TimestampedModel): user = models.OnetoOneField(settings.AUTH_USER_MODEL,on_delete=models.PROTECT) manager = models.ForeignKey('self',on_delete=models.CASCADE,limit_choices_to={'manager__isnull': True},blank=True) department = models.ForeignKey(Department,on_delete=models.CASCADE) job_level = models.ForeignKey(JobLevel,on_delete=models.CASCADE) profile_pic = models.ImageField(upload_to='photos/%Y/%m/%d',max_length=128,blank=True) objects = EmployeeManager() class Meta: db_table = 'tc_employees' unique_together = [['department','job_level']] def __str__(self): return f'{self.user}' class Asset(TimestampedModel): class DeviceType(models.TextChoices): PHONE = 'PH','Phone' TABLET = 'TB','Tablet' LAPTOP = 'LP','Laptop' DESKTOP = 'DS','Desktop' device_type = models.CharField(max_length=2,choices=DeviceType.choices,default=DeviceType.LAPTOP) serial_number = models.CharField(max_length=32,unique=True) assigned_to = models.ForeignKey(Employee,on_delete=models.PROTECT) assigned_on = models.DateTimeField() returned_on = models.DateTimeField(blank=True,null=True) class Meta: db_table = 'tc_assets' def __str__(self): return f'{self.device_type.label} serial: {self.serial_number}' 字段,因为 user 字段是唯一的

如果我使用下面的 YAML 文件,我会收到一个错误

示例 3:

Employee

错误

user

我面临的问题仅仅是因为示例 3

中的 - model: employee.employee pk: 1 fields: user: [manager.finance] manager: NULL department: [Finance] job_level: [MNGR] created_at: '2021-06-03' updated_at: '2021-06-03' - model: employee.employee pk: 2 fields: user: [team_leader.finance] manager: [manager.finance] department: [Finance] job_level: [LEAD] created_at: '2021-06-03' updated_at: '2021-06-03' ,Traceback (most recent call last): File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/db/models/fields/__init__.py",line 1823,in get_prep_value return int(value) ValueError: invalid literal for int() with base 10: 'manager.finance' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/core/serializers/python.py",line 134,in Deserializer value = base.deserialize_fk_value(field,field_value,using,handle_forward_references) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/core/serializers/base.py",line 310,in deserialize_fk_value obj = default_manager.db_manager(using).get_by_natural_key(*field_value) File "/home/selvaganesh/models/mtest/employee/models.py",line 67,in get_by_natural_key return self.get(user=user) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/db/models/manager.py",line 85,in manager_method return getattr(self.get_queryset(),name)(*args,**kwargs) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/db/models/query.py",line 424,in get clone = self._chain() if self.query.combinator else self.filter(*args,line 941,in filter return self._filter_or_exclude(False,args,kwargs) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/db/models/query.py",line 961,in _filter_or_exclude clone._filter_or_exclude_inplace(negate,line 968,in _filter_or_exclude_inplace self._query.add_q(Q(*args,**kwargs)) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/db/models/sql/query.py",line 1391,in add_q clause,_ = self._add_q(q_object,self.used_aliases) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/db/models/sql/query.py",line 1410,in _add_q child_clause,needed_inner = self.build_filter( File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/db/models/sql/query.py",line 1345,in build_filter condition = self.build_lookup(lookups,col,value) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/db/models/sql/query.py",line 1191,in build_lookup lookup = lookup_class(lhs,rhs) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/db/models/lookups.py",line 25,in __init__ self.rhs = self.get_prep_lookup() File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/db/models/fields/related_lookups.py",line 117,in get_prep_lookup self.rhs = target_field.get_prep_value(self.rhs) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/db/models/fields/__init__.py",line 1825,in get_prep_value raise e.__class__( ValueError: Field 'id' expected a number but got 'manager.finance'. During handling of the above exception,another exception occurred: Traceback (most recent call last): File "manage.py",line 22,in <module> main() File "manage.py",line 18,in main execute_from_command_line(sys.argv) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/core/management/__init__.py",line 419,in execute_from_command_line utility.execute() File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/core/management/__init__.py",line 413,in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/core/management/base.py",line 354,in run_from_argv self.execute(*args,**cmd_options) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/core/management/base.py",line 398,in execute output = self.handle(*args,**options) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/core/management/commands/loaddata.py",line 78,in handle self.loaddata(fixture_labels) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/core/management/commands/loaddata.py",line 123,in loaddata self.load_label(fixture_label) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/core/management/commands/loaddata.py",line 181,in load_label for obj in objects: File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/core/serializers/pyyaml.py",line 76,in Deserializer yield from PythonDeserializer(yaml.load(stream,Loader=SafeLoader),**options) File "/home/selvaganesh/.virtualenvs/mtest/lib/python3.8/site-packages/django/core/serializers/python.py",line 136,in Deserializer raise base.DeserializationError.WithData(e,d['model'],d.get('pk'),field_value) django.core.serializers.base.DeserializationError: Problem installing fixture '/home/selvaganesh/models/mtest/employee/fixtures/employee.yaml': Field 'id' expected a number but got 'manager.finance'.: (employee.employee:pk=2) field_value was '['manager.finance']' 字段

示例 2 运行良好

其他外键字段pk: 2manageruser一切正常

如果我使用 department 工作正常但是如果我使用 job_level 我收到一个错误

如何解决这个问题manager: NULL 请帮帮我

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...