/ / Créer des modèles django correctement - django, django-models, django-admin

Créer des modèles django correctement - django, django-models, django-admin

J'ai des modèles Django comme suit:

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

Ainsi, membre et abonnement doivent être OneToOneField relation, et abonnement et type aussi OneToOneField relation.

Mais je veux que ce membre reçoive une souscription de type default=true, s'il crée un nouveau compte.

Ce n’est peut-être pas la question comme il se doit, mais j’aimerais cependant recevoir des conseils.

Merci.

Réponses:

0 pour la réponse № 1

Il y a généralement deux options:

  1. Joindre une fonction à Member post_save signal, en fonction créer des instances appropriées si elle a été appelée avec 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. Passer outre Member.save() méthode et créer des instances appropriées si self.pk est None.

    def save(self, *args, **kwargs):
    if self.pk is None:
    <here create your subscription>
    super().save(*args, **kwargs)
    

Dans les deux cas, vous devez vous rappeler d’associer les Subscription avec votre nouveau Member.