2为两个表定义OneToOneField。一个被删除但不是其他

时间:2016-12-16 06:41:01

标签: django django-models

我在我的模型中定义了两个OneToOneFields,如下所示:

class StudentCrossMap(models.Model):
    rfId = models.OneToOneField(StudentDailyTrans)
    studentId = models.OneToOneField(StudentMaster)

当我在上面提供rfId的模型上应用删除时,StudentDailyTrans中与其相关的条目会被删除,但StudentMaster中的条目未被删除。

理想情况下,如果我从StudentCrossMap删除对象,则不应该从映射表中删除条目,因为这些表不依赖于StudentCrossMap表。

请告知我是否做错了。

*编辑:相关表格

class StudentDailyTrans(models.Model):
    rfId = models.CharField(max_length=30, primary_key=True)
    schoolId = models.ForeignKey(SchoolMaster, on_delete=models.CASCADE, db_index=False)
    fromTime = models.DateTimeField(null=True)
    toTime = models.DateTimeField(null=True)
    totalSwipeInstance = models.IntegerField(default=0)
    lastUpdateTs = models.DateTimeField(auto_now=True)

class StudentMaster(models.Model):
    studentId = models.IntegerField(primary_key=True)
    schoolId = models.ForeignKey(SchoolMaster, on_delete=models.CASCADE)
    parentId = models.ForeignKey(ParentMaster, on_delete=models.CASCADE)

class SchoolMaster(models.Model):
    schoolId = models.IntegerField(primary_key=True)
    subsStrtDt = models.DateTimeField(default=timezone.now)

class ParentMaster(models.Model):
    parentId = models.AutoField(primary_key=True)
    parentName = models.CharField(max_length=20, default='parent')

1 个答案:

答案 0 :(得分:2)

如果我已经理解了你发布的内容,你最好选择这样的设计。

class Student(models.Model):
    id = models.IntegerField(primary_key=True)
    school = models.ForeignKey(SchoolMaster, on_delete=models.CASCADE)
    parent = models.ForeignKey(ParentMaster, on_delete=models.CASCADE)
    rf = models.CharField(max_length=30, primary_key=True)

这基本上就是您原来的StudentMaster模型。我已将其重命名为Student。我还重命名了字段名称以符合通常的django命名约定(学校而不是外键的school_id)

现在,您可以删除StudentDailyTransStudentCrossMap我们正在更有效地保存相同的数据,但没有冗余。这消除了你问的问题!!

您同意我的说法,代码更具可读性。