尝试在 Django 中的模型表之间建立关系。但是在插入值时出现错误 |外键项必须是一个实例

Posted

技术标签:

【中文标题】尝试在 Django 中的模型表之间建立关系。但是在插入值时出现错误 |外键项必须是一个实例【英文标题】:Trying to establish a realtion Between model tables in Django.but iam getting error while insering values |foreign-key item must be an instance 【发布时间】:2021-09-03 19:34:57 【问题描述】:
class User(AbstractUser):
    pass
class auction_list(models.Model):
    item_id=models.IntegerField(primary_key=True)
    item_name=models.CharField(max_length=64)
    owner=models.CharField(max_length=64)
    image=models.CharField(max_length=128)
    def __str__(self):
        return f"self.item_id:self.ownerself.item_name"
class bid(models.Model):
    item_id=models.ForeignKey(auction_list,on_delete=models.CASCADE,related_name="currentbid")
    bid=models.IntegerField(max_length=16)
    user=models.CharField(max_length=64)
    def __str__(self) :
        return f"self.item_idself.bidself.user"

当我尝试插入值时,我得到了这个错误

我尝试做的插入:

In [16]: a3=auction_list(item_id=3,item_name="keyboard",owner="alex" )

In [17]: a3.save()
In [18]: a3
Out[18]: <auction_list: 3:alexkeyboard>
In [20]: b1=bid(item_id=3,bid=100,user="alex")

我得到的错误是

In [20]: b1=bid(item_id=3,bid=100,user="alex")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-20-6befcb719aa3> in <module>
----> 1 b1=bid(item_id=3,bid=100,user="alex")

~\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\base.py in __init__(self, *args, **kwargs)
    483                 # checked) by the RelatedObjectDescriptor.
    484                 if rel_obj is not _DEFERRED:
--> 485                     _setattr(self, field.name, rel_obj)
    486             else:
    487                 if val is not _DEFERRED:

~\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\fields\related_descriptors.py in __set__(self, instance, value)  
    213         # An object must be an instance of the related class.
    214         if value is not None and not isinstance(value, self.field.remote_field.model._meta.concrete_model):
--> 215             raise ValueError(
    216                 'Cannot assign "%r": "%s.%s" must be a "%s" instance.' % (
    217                     value,

ValueError: Cannot assign "3": "bid.item_id" must be a "auction_list" instance.

有人可以帮我理解这里的问题是什么,我该如何解决这些问题

【问题讨论】:

【参考方案1】:

当您应该将该表的实例(或查询集,换句话说)插入投标表中该 item_id 字段的值时,您正在尝试插入一个整数。

我的意思是,您应该使用 b1=bid(item_id=a3, 而不是 b1=bid(item_id=3,bid=100,user="alex") bid=100, user="alex") 然后 .save()。

如果您不想插入查询集而只想包含整数,则可以将代码修改为 b1=bid(item_id_item_id=3, bid=100, user="alex"),它会工作得很好。

【讨论】:

只是一个简短的说明 - 如果您想在帖子中添加内联代码,请使用 backticks so they are pre-formatted - 就像这样。【参考方案2】:

Django 自动将…_id 后缀添加到ForeignKeys 以定义将引用另一个模型的主键(或另一个唯一字段)的字段。

因此,您应该将模型定义为:

class bid(models.Model):
    item=models.ForeignKey(
        auction_list,
        on_delete=models.CASCADE,
        related_name='currentbid'
    )

然后您可以使用以下命令创建 Bid 对象:

Bid.objects.create(
    item=some_auction_list,
    # …
)

或与:

Bid.objects.create(
    item_id=primary_key_of some_auction_list,
    # …
)

注意:Django 中的模型是用 PascalCase 编写的,而不是 snake_case, 所以您可能想将模型从 bid 重命名为 Bid

【讨论】:

以上是关于尝试在 Django 中的模型表之间建立关系。但是在插入值时出现错误 |外键项必须是一个实例的主要内容,如果未能解决你的问题,请参考以下文章

web框架开发-Django模型层-多表操作

Django之模型层-多表操作

Django框架之---------模型(Models)

任何人都可以仅使用 ForeignKey 在两个 django 模型之间建立多对多关系吗?

django rest 框架序列化程序中的关系数据库

django model