首页 > 解决方案 > 如何访问 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'

标签: pythondjangodjango-import-export

解决方案


问题是下面的行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


推荐阅读