python - 如何访问 ForeignKey 子模型的 ID?int() 参数必须是字符串、类似字节的对象或数字,而不是 'builtin_function_or_method
问题描述
我不断收到错误:
行号:1 - int() 参数必须是字符串、类似字节的对象或数字,而不是 'builtin_function_or_method'
我试图访问子模型 ID 以按每个商店的公司实例进行排序。如果我通过子模型上传数据但尝试做相反的事情会引发错误,它会起作用吗?
模型.py
class Parent(models.Model):
store = models.IntegerField(primary_key=True)
state = models.CharField(max_length=250, blank=True)
# pylint: disable=R0903
def __str__(self):
return '{}'.format(self.store)
class Child(models.Model):
id = models.BigIntegerField(primary_key=True)
store = models.ForeignKey('Parent', on_delete=models.CASCADE, null=True)
company = models.CharField(max_length=250, blank=True)
rank = models.IntegerField(blank=True, default='')
# pylint: disable=R0903
def __str__(self):
return '{}'.format(self.company)
管理员.py
class ParentResource(resources.ModelResource):
state = fields.Field(attribute='state', column_name='State')
store = fields.Field(attribute='store', column_name='Store')
company = fields.Field(attribute='company', column_name='Company', widget=ForeignKeyWidget(Child, 'company'))
class Meta:
model = Parent
import_id_fields = ('store', 'state',)
fields = ('store', 'state', 'company',)
def before_import_row(self, row, **kwargs):
company = row.get('Company')
store = row.get('Store')
store = Parent.objects.get_or_create(store=store)
rank = row.get('Rank')
company = Child.objects.get_or_create(store=store[0], company=company, rank=rank, id=id)
class ParentAdmin(ImportExportModelAdmin):
inlines = [ChildInline]
resource_class = ParentResource
list_display = ['store', 'state']
class Meta:
model = Parent
完整回溯
Traceback (most recent call last):
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/import_export/resources.py", line 499, in import_row
self.before_import_row(row, **kwargs)
File "/home/developer/boards/cms/money/admin.py", line 69, in before_import_row
company = Child.objects.get_or_create(store=store[0], company=company, rank=rank, id=id)
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/django/db/models/query.py", line 486, in get_or_create
return self.get(**lookup), False
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/django/db/models/query.py", line 390, in get
clone = self.filter(*args, **kwargs)
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/django/db/models/query.py", line 844, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/django/db/models/query.py", line 862, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1263, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1287, in _add_q
split_subq=split_subq,
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1225, in build_filter
condition = self.build_lookup(lookups, col, value)
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1096, in build_lookup
lookup = lookup_class(lhs, rhs)
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/django/db/models/lookups.py", line 20, in __init__
self.rhs = self.get_prep_lookup()
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/django/db/models/lookups.py", line 70, in get_prep_lookup
return self.lhs.output_field.get_prep_value(self.rhs)
File "/home/developer/.local/share/virtualenvs/cms-JnJjjKhL/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 965, in get_prep_value
return int(value)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'builtin_function_or_method'
解决方案
问题是下面的行id
不存在。如果您想要对象的 id,请使用self.id
.
company = Child.objects.get_or_create(store=store[0], company=company, rank=rank, id=id)
这可以更改为:
company = Child.objects.get_or_create(store=store[0], company=company, rank=rank, id=self.id)
或将其设为您需要的对象的 id,例如store.id
.
注意:使用字段get_or_create
时,您实际上不需要使用 a 。因为如果字段不存在,id
您不想手动存储自己。id
推荐阅读
- dynamic - nuxtjs spa 动态路由在 prod 部署后生成 404
- powershell - 检查字符串是否在字符串数组中
- c# - 如果嵌套数组包含值,则获取所有对象 - ElasticSearch
- c - c中递归函数中的静态变量
- mongodb - Mongo聚合查询不使用索引
- c++ - FILE_FLAG_POSIX_SEMANTICS 不起作用
- javascript - 有没有办法将字符串数组用作具有解构赋值的变量名?(Javascript)
- node.js - 未注册身份验证策略“jwt”
- c# - 如何访问并确认将我的 SelectedListItem TEXT 从我的下拉列表从一个视图转移到另一个视图?
- javascript - 类型检查对象javascript