以正确的方式创建django模型

时间:2017-03-01 08:47:38

标签: django django-models django-admin

我有django模型如下:

class Type(models.Model):
    limit = models.IntegerField()
    name = models.CharField(max_length=50)
    default = models.BooleanField()

    def __str__(self):
        return self.name


class Subscription(models.Model):
    started = models.DateField()
    type = models.OneToOneField(Type)

    def __str__(self):
        return self.type.name


class Member(models.Model):
    user = models.ForeignKey(to=User)
    number = models.CharField(max_length=10)
    address = models.CharField(max_length=255)
    postcode = models.CharField(max_length=10)
    city = models.CharField(max_length=100)
    active = models.BooleanField()
    subscription = models.OneToOneField(Subscription, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

因此,成员和订阅需要是OneToOneField关系,订阅和类型也需要OneToOneField关系。

但我希望该成员获得default=true类型的订阅,如果他创建了一个新帐户。

这可能不是应该的问题,但是,我想听听建议。

感谢。

1 个答案:

答案 0 :(得分:0)

通常有两种选择:

  1. 将一些函数附加到Member post_save信号,在函数中创建适当的实例(如果使用created=True调用它:

    from django.db.models.signals import post_save
    from django.dispatch.dispatcher import receiver
    
    @receiver(post_save, sender='myapp.Member')
    def create_default_subscription(sender, instance, created, raw, using, update_fields):
        if created:
            <here create your subscription>
    
  2. 如果Member.save()self.pk,则覆盖None方法并创建相应的实例。

    def save(self, *args, **kwargs):
        if self.pk is None:
            <here create your subscription>
        super().save(*args, **kwargs)
    
  3. 在这两种情况下,您都需要记住将创建的Subscription与新的Member相关联。