Джанго Сэйв Уничтожение новых отношений один на один? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь сохранить отношение один-к-одному в Django, но после сохранения объекта Address он удаляет отношение на объекте, с которым я пытаюсь создать отношение.

В этом случае я пытаюсь создать связь между объектом Person, который уже существует в моей базе данных, и объектом Address, который я создаю.Я могу присвоить атрибут адреса человека новому адресу, и он появляется перед сохранением.Тем не менее, после сохранения человека, объект адреса человека исчезает.Я проверил, чтобы убедиться, что у меня есть правильные разрешения MySQL в файле настроек, и я могу сделать все, что мне нужно, чтобы сохранить новый объект.В базе данных есть новая запись адреса, но нет адреса, связанного с записью человека в таблице Person.Что я делаю не так?

if person.address == None:
    person.address = managerModels.Addresses()
person.address.zipCode = newAttributeValue # set up zip code
print("Address pre-save {}".format(person.address))
person.address.save()
print("Address post-address save: {}".format(person.address))
person.save()
print("Address post person-save: {} ".format(person.address))

Вывод на терминал:

Address pre-save None None None None 94536
Address post-address save: None None None None 94536
Address post person-save: None

Вот как декларируются модели в файле models.py.

class Person(models.Model):

    userId = models.OneToOneField( settings.AUTH_USER_MODEL, verbose_name = "User account", on_delete=models.DO_NOTHING, null = True)
    firstName = models.CharField(max_length=40)
    lastName = models.CharField(max_length=40)
    phone = models.CharField("Phone Number", max_length=12)
    address = models.OneToOneField(Addresses, verbose_name = "Address", on_delete=models.DO_NOTHING, null=True)
    tutorType = models.CharField("Category", max_length=12)
    gender = models.CharField("Gender", max_length=6)
    subjects = models.CharField("Subjects", max_length = 256)
    email = models.CharField("Email", max_length = 45, blank = True)
    active = models.BooleanField(default = True)


    class Meta:
        ordering = ('userId', 'firstName', 'lastName', 'phone','tutorType', 'gender', 'subjects')
        db_table = 'Persons'

    def __str__(self):
        return "\n{} {}\nPhone: {}\nAddress:{}\ntutorType: {}\nGender: {}\nsubjects: {}\nemail: {}\nactive {}".format(self.firstName,self.lastName, self.phone, self.address, self.tutorType, self.gender, self.subjects, self.email, self.active)


class Addresses(models.Model):
    address1 = models.CharField("Address Line 1", max_length=128, null=True)
    address2 = models.CharField("Address Line 2", max_length=128, null=True)
    city = models.CharField("City", max_length=64, null=True)
    state = models.CharField("State", max_length=64, null = True)
    zipCode = models.CharField("Zip Code", max_length=5, null = True)

    class Meta:
        ordering = ('address1', 'address2', 'city', 'state','zipCode')
        db_table = 'Addresses'
    def __str__(self):
        return "{} {} {} {} {}".format(self.address1, self.address2, self.city, self.state, self.zipCode)

Отношения между человеком и адресом один в один.Что-то явно не так, что я делаю?Я сузил эту проблему до нескольких строк кода, и я все еще застрял.Любой совет?

Редактировать: я обновил код, так что я работаю только с экземпляром адреса человека, но экономия на человеке стирает данные адреса.до сих пор не знаю, что не так.

1 Ответ

0 голосов
/ 15 февраля 2019

Вы должны сохранить объект Address, прежде чем добавить его в экземпляр Person.Как это:

address = managerModels.Addresses() # create a new address
address.zipCode = newAttributeValue # set up zip code
address.save()

person.address = address
person.save()
...