【问题标题】:Django Save Wiping out New One to One Relationship?Django Save 消除新的一对一关系?
【发布时间】:2019-07-08 20:30:33
【问题描述】:

我试图在 Django 中保存一对一的关系,但在我保存 Address 对象后,它会删除我试图与之建立关系的对象上的关系。

在这种情况下,我试图在我的数据库中已经存在的“Person”对象和我正在​​创建的“Address”对象之间创建关系。我可以将 Person 的地址属性分配给新地址,它会在保存之前显示。但是,保存人之后,人的地址对象就消失了。我检查以确保我在设置文件中拥有正确的 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)

Person 和 address 之间的关系是一对一的。我做的有什么明显的错误吗?我已经将这个问题缩小到这几行代码,但我仍然卡住了。有什么建议吗?

编辑:我已经更新了代码,因此我只使用人员地址的一个实例,但保存在人员上的内容正在清除地址数据。还是不知道怎么回事。

【问题讨论】:

  • 其他所有的无是什么?显示完整的模型,包括 str 方法和任何信号。
  • @DanielRoseman 完成!

标签: python django object save


【解决方案1】:

您应该先保存 Address 对象,然后再将其添加到 Person 实例。像这样:

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

person.address = address
person.save()

【讨论】:

  • 这基本上就是我现在正在做的事情,但是当我将人员实例保存回数据库时,地址仍然会被清除。这是一个 MySQL 数据库,如果有帮助的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2019-09-20
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多