0
votes

Champ d'année Django models.py

J'ai créé une base de données avec la population et les années par IntegerField, mais y a-t-il un moyen de créer le champ année par champ de date uniquement pour des années ni des mois ni des jours?

class Nufus_ilce(models.Model):
    city = models.CharField(max_length=15)
    year = models.IntegerField(default=0)
    population = models.IntegerField(default=0)
    def __str__(self):
        return '%s %s' % (self.city, self.year)


4 commentaires

Pourquoi voulez-vous en faire un champ de date?


Premièrement, je veux identifier comme une date et deuxièmement, j'ai des problèmes indiqués dans le tableau html lorsque USE_THOUSAND_SEPARATOR = True est utilisé. @bruno desthuilliers


USE_THOUSANDS_SEPARATOR n'affecte que les données localisées, et vous pouvez contrôler quelles données sont localisées et lesquelles ne le sont pas (cf docs.djangoproject.com/en/2.2/topics/i18n/formatting/... ). Dans tous les cas, la modification de votre schéma de base de données uniquement pour des problèmes de présentation est un anti-modèle. Cela laisse avec "d'abord je veux m'identifier en tant que date", ce qui est un peu une tautologie: "Q: pourquoi voulez-vous X?" "A: Parce que je veux X" ;-)


NB: ne pas dire qu'il n'y a aucune raison (discutable) de faire de ce champ un champ de date, je me demande simplement pourquoi vous voudriez le faire (quel problème concret vous essayez de résoudre avec ce changement).


3 Réponses :


-1
votes

Je vous conseille d'utiliser un champ de choix simple:

class Nufus_ilce(models.Model):
    city = models.CharField(max_length=15)
    MY_CHOICES = (
            ('a', '2000'),
            ('b', '2001'),
            ('c', '2002'),
            ('d', '2003'),
        )

    year = models.CharField(max_length=1, choices=MY_CHOICES)
    population = models.IntegerField(default=0)
    def __str__(self):
        return '%s %s' % (self.city, self.year)


0 commentaires

1
votes

Habituellement des modèles.IntegerField est un bon choix pour seulement un an. Cependant, si vous souhaitez effectuer certaines opérations datetime, déclarez votre année comme model.DateField et enregistrez l'année 2019 comme date (2019, 1, 1).


0 commentaires

0
votes

Eh bien, vous pouvez continuer à utiliser IntegerField ou le convertir en CharField car nous allons convertir cette valeur en chaîne pour la convertir en objet datetime python.

from django.utils import timezone

class Nufus_ilce(models.Model):
    city = models.CharField(max_length=15)
    year = models.CharField(default='2012')
    population = models.IntegerField(default=0)
    def __str__(self):
        return '%s %s' % (self.city, self.year)
    @property
    def get_year(self):
        date = timezone.datetime.strptime('%Y', self.year)  # format it to datetime object. You need to convert `year` to str if it is `IntergerField`. ex: str(self.year).
        return date

Maintenant, vous pouvez simplement utiliser instance.get_year.


0 commentaires