尝试在 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
后缀添加到ForeignKey
s 以定义将引用另一个模型的主键(或另一个唯一字段)的字段。
因此,您应该将模型定义为:
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 中的模型表之间建立关系。但是在插入值时出现错误 |外键项必须是一个实例的主要内容,如果未能解决你的问题,请参考以下文章