【问题标题】:Django: Non-primary Foreign Key object can't access related model instanceDjango:非主外键对象无法访问相关模型实例
【发布时间】:2021-11-02 06:02:28
【问题描述】:

我是 Django 的新手。我在 models.py 中有 2 个类 tech_systemequiptment

class tech_system(models.Model):
    id_tech_system = models.BigAutoField(db_column='ID_tech_system', primary_key=True)
    system_descript_short = models.CharField(max_length=255, blank=True, null=True)
    #More field here
    tech_system_code = models.CharField(unique=True, max_length=40)

    class Meta:
        managed = False
        db_table = 'tech_system'
        
    def __str__(self):
        return self.system_descript_short

        
class equiptment(models.Model):
    id_thietbi = models.BigAutoField(db_column='ID_thietbi', primary_key=True)
    tech_system_code = models.ForeignKey('tech_system', models.DO_NOTHING, db_column="tech_system_code", blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'equiptment'

我使用python shell,设备模型对象无法访问相关的tech_system模型实例。我得到错误匹配查询不存在。 我想获得值 obj1.equiptment.tech_system_code.system_descript_short。我该怎么办?

谢谢。

>>> obj1 = equiptment.objects.first()
>>> obj1.tech_system_code_id
'530'
>>> obj1.tech_system_code
Traceback (most recent call last):
  File "D:\Dev1\env1\lib\site-packages\django\db\models\fields\related_descriptors.py", line 173, in __get__
    rel_obj = self.field.get_cached_value(instance)
  File "D:\Dev1\env1\lib\site-packages\django\db\models\fields\mixins.py", line 15, in get_cached_value
    return instance._state.fields_cache[cache_name]
KeyError: 'tech_system_code'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "D:\Dev1\env1\lib\site-packages\django\db\models\fields\related_descriptors.py", line 187, in __get__
    rel_obj = self.get_object(instance)
  File "D:\Dev1\env1\lib\site-packages\django\db\models\fields\related_descriptors.py", line 154, in get_object
    return qs.get(self.field.get_reverse_related_filter(instance))
  File "D:\Dev1\env1\lib\site-packages\django\db\models\query.py", line 437, in get
    self.model._meta.object_name
app.models.tech_system.DoesNotExist: tech_system matching query does not exist.

【问题讨论】:

  • 顺便说一句,equiptment 有一个错字
  • 一个问题,被引用的行实际上是否存在于目标表中?
  • 您好 Jiri Baum,引用行存在。 &gt;&gt;&gt; tech_system.objects.filter(tech_system_code='530').values() &lt;QuerySet [{'id_tech_system': 32, 'system_descript_short': 'PT-VPC', 'system_year': 0, 'system_drawing': None, 'system_doc_btbd': None, 'system_doc_vh': None, 'system_type_id': 'TTB-MD', 'dept_code_id': 'VPC', 'tech_system_code': '530'}]&gt;
  • 默认外键是指主键,你的主键是 id_tech_system 并且值是 32 而不是 530
  • 嗨,pouria farhadi,是的,我知道,但数据库架构无法更改。如您所见,外键指的是具有“db_column”字段的非主键字段,正如我在此处声明的tech_system_code = models.ForeignKey('tech_system', models.DO_NOTHING, db_column="tech_system_code", blank=True, null=True)。在 Python shell 中,值 obj1.tech_system_code_id 返回“530”而不是“32”。

标签: python django foreign-keys


【解决方案1】:

我发现 tech_system_code 记录被分配为 str 类型,而不是设备模型中的对象。导入数据库的记录值不正确。 感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多