这是商家模型:
class Merchant(models.Model):
merchant_token = models.CharField(max_length=255, unique=True)
这是交易模型,其中第一个字段链接到Merchant模型上的商人_令牌:
class Transaction(models.Model):
transaction_merchant_token = models.ForeignKey(Merchant, on_delete=models.CASCADE)
首先,我通过POST请求获取商家令牌,然后通过以下方式获取商家字段:
merchant = Merchant.objects.get(merchant_token__exact=posted_token)
但是当我想插入带有已发布令牌的新交易时:
new_transaction = Transaction(
transaction_merchant_token=merchant.merchant_token
)
new_transaction.save()
我收到ValueError异常:
Cannot assign "93C38:9VLlOUuaRq7J8boHyX80cI5MYy8yCpsb": Transaction.transaction_merchant_token must be a Merchant instance.
答案 0 :(得分:1)
您应该传递商家实例本身而不是令牌
new_transaction = Transaction(transaction_merchant_token=merchant)
new_transaction.save()
我将重新定义模型,使其看起来像这样
class Merchant(models.Model):
token = models.CharField(max_length=255, unique=True)
class Transaction(models.Model):
merchant = models.ForeignKey(Merchant, on_delete=models.CASCADE)
然后,当您想要获取商家令牌时,您可以使用这种方式
new_transaction.merchant.token
答案 1 :(得分:1)
从概念上讲,ForeignKey
是指模型对象,而不是该对象的主键。
是的,Django将创建一个field_id
(给定ForeignKey
字段的名称为field
)来存储所引用的模型对象的主键的值,并且仅存储field_id
是房地产数据库列。但是field_id
与field
不同。
您因此可以做两件事:
您使用transaction_merchant_token
字段,并传递一个Merchant
对象:
new_transaction = Transaction(
transaction_merchant_token=merchant
)
您使用transaction_merchant_token_id
字段,然后传递主键的值(例如令牌):
new_transaction = Transaction(
transaction_merchant_token_id=merchant.pk
)
注意(命名):由于
ForeignKey
本身不是令牌本身,因此通常在ForeignKey
后加上{模型, 不要放在模型对象的主键之后,所以我建议重命名 您的外键,例如:class Transaction(models.Model): transaction_merchant = models.ForeignKey(Merchant, on_delete=models.CASCADE)
甚至更好:
class Transaction(models.Model): merchant = models.ForeignKey(Merchant, on_delete=models.CASCADE)
使用当前模型的名称前缀属性不是 必要,如果您想在其中使用“ 鸭子打字”,可能会很不好 功能。