Django, how to get new id during save

时间:2018-03-25 20:59:57

标签: django django-models

I have this code:

class Unit(Location):
    Name = models.CharField(max_length=100, unique=True)
    Hull = models.CharField(max_length=25, unique=True)
    Type = models.CharField(max_length=5, CHOICES=UNIT_TYPE_CHOICE)
    Precomm = models.BooleanField(default=True)
    Email = models.CharField(max_length=250, verbose_name="Email")
    Phone = models.CharField(max_length=20, verbose_name="Primary Phone")

    def __self__(self):
        return self.Name + ' (' + self.Hull + ')'

    def save(self, *args, **kwargs):
        if not self.pk:
            co = Position(Name='Commanding Officer', Description='Position in command of chapter.', Unit=self.pk)
            co.save()
            xo = Position(Name='Executive Officer', Description='Second in Command of Chapter', Unit=self.pk)
            xo.save()
            cob = Position(Name='Chief of the Boat', Description='Senior Enlisted Adviser in charge of cadet affairs', Unit=self.pk)
            cob.save()
        super(Unit, self).save(args, kwargs)


class Position(models.Model):
    Name = models.CharField(max_length=100)
    Description = models.TextField()
    Unit = models.ForeignKey(Unit)

The idea is to auto-create three Positions when a Unit is saved. The positions are set in the save process. My concern is that self.pk is not created at the point of the save definition. How do I get the id so I can create the three records?

Thanks

2 个答案:

答案 0 :(得分:1)

在调用super之后将填充id,因此您可以使用标志:

created = self.pk is None
super(Unit, self).save(args, kwargs)
if created:
    ...

答案 1 :(得分:0)

You should use signals instead of overriding save, especially if you want to do something like this. Docs are here

from django.db.models.signals import post_save
from django.dispatch import receiver

class Unit(models.Model):
    # ... fields here


@receiver(post_save, sender=Unit)
def create_related(sender, instance, created, **kwargs):
    if created:
        co = Position(Name='Commanding Officer', Description='Position in command of chapter.', Unit=instance.pk)
        co.save()
        xo = Position(Name='Executive Officer', Description='Second in Command of Chapter', Unit=instance.pk)
        xo.save()
        cob = Position(Name='Chief of the Boat', Description='Senior Enlisted Adviser in charge of cadet affairs', Unit=instance.pk)
        cob.save()