Как я могу написать Django пользовательский метод сохранения, который получит или создаст внешний ключ перед сохранением - PullRequest
0 голосов
/ 02 мая 2020

У меня есть следующие Django модели для города и штата, настроенные следующим образом:

class State(models.Model):
    name = models.CharField(max_length=55)
    abbreviation = models.CharField(max_length=2)

class City(models.Model):
    name = models.CharField(max_length=55)
    state = models.ForeignKey( State, on_delete=models.CASCADE, null=True, blank=True )

Я импортирую json данные компании, которые включают NAME, CITY и STATE. Это выглядит так:

{'NAME': 'Company Name', 'ADDRESS': '123 Main St.', 'CITY': 'Bethel', 'STATE': 'Connecticut'}

Я пытаюсь настроить собственный метод сохранения для объекта моей компании, который бы получал или создавал необходимый объект City при создании или обновлении компании. Создание объекта City, в свою очередь, потребует получения или создания объекта State.

class Company(models.Model):
    name = models.CharField(max_length=55)
    address1 = models.CharField(max_length=200, blank=True)
    address2 = models.CharField(max_length=200, blank=True)
    city = models.ForeignKey( City, on_delete=models.CASCADE, null=True, blank=True )
    zipcode = models.CharField(max_length=20, blank=True)

    def save(self, *args, **kwargs):
        self.city, created = City.objects.get_or_create(name=city)

        super(Company, self).save(*args, **kwargs)

Поскольку поле состояния в City не является обязательным, я начинаю с простой попытки создания города ,

В моем коде я создаю новый экземпляр Company следующим образом:

        company, created = Company.objects.update_or_create(
            name=p['NAME],
            defaults = {
                'address1': p.get('ADDRESS1', None),
                'address2': p.get('ADDRESS2', None),
                'city': p.get('CITY', None),
                'zipcode': p.get('ZIP', None),
            }

Но Django возвращает эту ошибку:

Cannot assign "'Bethel'": "Company.city" must be a "City" instance.

1 Ответ

0 голосов
/ 02 мая 2020

Ваша проблема заключается в этой части: 'city': p.get('CITY', None)

У вас есть поле с именем city в вашей модели Company, которое является иностранным ключом для модели City, тогда как p.get('CITY', None) возвращает либо город строка, если она доступна, или None, если нет, которая не соответствует требованиям для поля Foreignkey.

Таким образом, вы должны либо получить / создать экземпляр города в своем представлении и передать его в поле city или Вы должны изменить имя поля, переданное методу save, и получить к нему доступ.

Я рекомендую передать экземпляр City в ваше представление вместо переопределения метода сохранения, что может вызвать дополнительные сложности, особенно при изменении твоя модель и ты забываешь об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...