必须是实例django

时间:2018-10-16 17:31:21

标签: django foreign-keys valueerror

这是商家模型:

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.

2 个答案:

答案 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_idfield 不同

您因此可以做两件事:

  1. 您使用transaction_merchant_token字段,并传递一个Merchant对象:

    new_transaction = Transaction(
        transaction_merchant_token=merchant
    )
  2. 您使用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)
     

使用当前模型的名称前缀属性不是   必要,如果您想在其中使用“ 鸭子打字”,可能会很不好   功能。