Должен быть экземпляр Джанго - PullRequest
0 голосов
/ 16 октября 2018

Это модель продавца:

class Merchant(models.Model):
     merchant_token = models.CharField(max_length=255, unique=True)

и это модель транзакции, в которой первое поле связано с merchant_token в модели продавца:

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 голосов
/ 16 октября 2018

Концептуально ForeignKey относится к объекту модели , а не к первичному ключу этого объекта.

Да, Django создаст field_id (учитывая имяПоле ForeignKey имеет значение field) для хранения значения первичного ключа упомянутого объекта модели, и только field_id является действительно столбцом базы данных.Но field_id, не , то же самое, что и field.

Таким образом, вы можете сделать две вещи:

  1. вы используетеПоле transaction_merchant_token, и вы передаете объект Merchant:

    new_transaction = Transaction(
        transaction_merchant_token=<b>merchant</b>
    )
  2. вы используете поле transaction_merchant_token_id, а затем передаете значение первичного ключа (например,токен):

    new_transaction = Transaction(
        transaction_merchant_token<b>_id</b>=merchant.pk
    )

Примечание ( номенклатура ): так как ForeignKey, таким образом, не является токеномСамо собой обычно принято называть ForeignKey после модели, а не после первичного ключа объекта модели, поэтому я советую переименовать ваш внешний ключ, например:

class Transaction(models.Model):
     <b>transaction_merchant</b> = models.ForeignKey(Merchant, on_delete=models.CASCADE)

или даже лучше:

class Transaction(models.Model):
     <b>merchant</b> = models.ForeignKey(Merchant, on_delete=models.CASCADE)

префикс атрибутов с именем текущей модели необязателен и может быть неправильным, если вы хотите использовать " duck typing " в функциях.

0 голосов
/ 16 октября 2018

Вы должны передать сам экземпляр продавца, а не токен.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...