È buona prassi avere il nome della classe come prefisso nel modello Django?

2

Ho scritto un modello in questo formato in Django:

class Block(models.Model):
    block_id = models.AutoField(primary_key=True)
    block_name = models.CharField(max_length=200)
    block_code = models.CharField(max_length=200)
    block_content = models.CharField(max_length=200)
    block_change_date = models.DateTimeField(auto_now=True, default=datetime.now())
    block_published_date = models.DateTimeField(auto_now_add=True, default=datetime.now())

È una pratica utile avere block_ (o qualunque altro nome di modello) per ognuno o aggiungere semplicemente la lunghezza ai nomi dei campi?

    
posta MikeFoxtrot 04.04.2015 - 17:08
fonte

1 risposta

7

No, non lo è.

Pensaci, dove ti serviranno?

  • Non quando crei il modello: sai quale modello stai creando.

  • Non all'interno del modello stesso: sai anche dove sei.

  • Né quando accedi al modello in un secondo momento: conosci ancora il tipo del modello, a meno che non ti interessi del tipo, in tal caso i prefissi saranno solo un fastidio.

Immagina un modello come:

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

% co_de avrebbe più senso di person.person_first_name ? person.first_name conterrà mai un Person che non è il primo nome della persona, quindi finirai per esempio con:

class Person(models.Model):
    person_first_name = models.CharField(max_length=30)
    person_last_name = models.CharField(max_length=30)
    persons_husband_first_name = models.CharField(max_length=30)
    persons_first_child_first_name = models.CharField(max_length=30)
    persons_pet_first_name = models.CharField(max_length=30)
    administrator_first_name = models.CharField(max_length=30)

Potresti aver già visto questo codice, ma un codice come questo è indicativo di un completo fraintendimento di OOP da parte dell'autore.

Un altro aspetto da considerare è ereditarietà . Potresti avere:

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class Employee(Person):
    pass

class Freelancer(Person):
    pass

Seguendo la convenzione in cui i membri del modello hanno il prefisso del nome della classe, finirai con aspettarti first_name , ma troverai employee.employee_first_name , che è contro-intuitivo. Se inizi a sovrascrivere i membri, le cose diventano ancora più confuse.

Infine, se hai bisogno di una fonte più autorevole, più specifica per i modelli di Django, guarda la documentazione . L'esempio sopra è copiato da questo. Vedrai che anche altri esempi non hanno prefissi del genere.

    
risposta data 04.04.2015 - 17:34
fonte

Leggi altre domande sui tag