Отношения ко многим для многих не добавляются методом .add () в Django - PullRequest
0 голосов
/ 16 февраля 2020

У меня проблема с добавлением записи в поле отношения многие ко многим. У меня есть следующие модели:

class Address(models.Model):
    id = models.AutoField(primary_key=True)
    country = CountryField(blank_label='(select country)', blank=False, null=False, verbose_name='Country')
    state = models.CharField(
        max_length=50,
        choices=STATE_CHOICES,
        verbose_name='State',
        blank=False,
        null=False
    )
    ...

class Volunteer(models.Model):
    userID = models.OneToOneField(User, on_delete=models.CASCADE, to_field='id', primary_key=True, related_name='volunteer')
    identificationNumber = models.CharField(max_length=50, unique=True, blank=False, null=False, verbose_name='Identification   Number')
    currentAddress = models.ManyToManyField(Address, related_name='volunteerCurrentAddress', verbose_name='Current Address', blank=False)
    permanentAddress = models.ManyToManyField(Address, related_name='volunteerPermanentAddress', verbose_name='Permanent Address', blank=False)
    ...

    def save(self, *args, **kwargs):
        self.slug = self.userID.username
        super(Volunteer, self).save(*args, **kwargs)

class TemporaryVolunteer(Volunteer):
    pass

И в представлениях я получаю поля currentAddress и permanentAddress как ManyToManyRelatedManager. Это temporaryVolunteer.currentAddress и temporaryVolunteer.permanentAddress. Я использую их для создания нового экземпляра Volunteer как

volunteer = Volunteer(...)
volunteer.save()
volunteer.currentAddress.add(temporaryVolunteer.currentAddress.all()[0])
volunteer.permanentAddress.add(temporaryVolunteer.permanentAddress.all()[0])
volunteer.save()

Но когда я делаю print(volunteer.currentAddress.all()) или print(volunteer.permanentAddress.all()), он возвращает пустой набор запросов. Я также проверил административный сайт для подтверждения, и нет никаких записей об адресе в экземпляре волонтера. Есть ли способ добавить записи с помощью этого подхода?

1 Ответ

0 голосов
/ 17 февраля 2020

Проблема была в оформлении базы данных. Я использовал новый класс TemporaryVolunteer для хранения непроверенных учетных записей и позже перешел в класс Volunteer после проверки. Поскольку я унаследовал TemporaryVolunteer от Volunteer класса, способ Django обрабатывает многие-многие отношения без создания дубликатов (Источник: https://docs.djangoproject.com/en/3.0/topics/db/examples/many_to_many/) привел к проблеме отсутствия записей в соответствующий Volunteer класс.

Первоначально я проверил это, скопировав всех членов Volunteer в TemporaryVolunteer. Убедившись, что это работает, я изменил структуру базы данных, так как это плохой подход, сохранил логическое значение isVerified в классе Volunteer и полностью удалил класс TemporaryVolunteer.

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