【问题标题】:ValueError: Cannot assign "5687": "Table2.kid" must be a "Table1" instanceValueError:无法分配“5687”:“Table2.kid”必须是“Table1”实例
【发布时间】:2023-03-18 10:45:01
【问题描述】:

Table1 我从调用某个 API 的管理脚本中获取数据。 Table2 也从 Api 获取数据。场景是xidkid 是相同的,所以我实现了OneToOne 关系,以便我可以在table2 的上下文中轻松地从table1 获取相关项目。必须填充Table1 才能填充table1,因为只有这样才能分配table2 实例。 5687 已经存在于 table1 中但我仍然得到错误:

ValueError: Cannot assign "5687": "Table2.kid" must be a "Table1" instance.

Models.py

class Table1(models.Model):
    xid = models.IntegerField(primary_key=True)
    amount = models.IntegerField()

class Table2(models.Model):
    kid = models.OneToOneField(Table1,primary_key=True, on_delete=models.CASCADE)
    vid = models.IntegerField(null=True, blank=True)
    g_amount = models.IntegerField()

这是我的脚本代码,对于获取数据的两个管理命令都是相同的。

Management/commands/script.py

    """ API CODE """

    data = {
        'kid': kid,
        'vid': vid,
        'g_amount': g_amount

    }
    if Table2.objects.filter(vid=xid).exists() or Table1.objects.filter(xid=kid).exists() is False:
        continue
    else:
        # print(data)
        instance = Table2(**dataff) 
        instance.save()

或者应该有一种方法我不需要OneToOne 关系。使用 Django 的 ORM 可以构造一个查询,将这两个表中的实例合并为一个,并将其放在一个虚拟表中,这样我就不会失去 ORM 功能。

【问题讨论】:

  • 5687 是kid 之一
  • 试试这个data = { 'kid': Table1.objects.get(xid=kid), 'vid': vid, 'g_amount': g_amount }
  • @JPG 尝试了你的上下文并且这个错误 - dashboard.models.DoesNotExist: Table1 matching query does not exist. 即使表 1 中已经存在 5687 的实例

标签: python django python-3.x django-models django-views


【解决方案1】:

在声明数据字典后应用模型字段的条件检查。它会在if条件之后声明,这样dict就可以带条件保存了。

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 2018-06-03
    • 1970-01-01
    • 2019-11-14
    • 2020-04-04
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多