[PYTHON] Verwenden Sie Modelle utils.Choices bequem TIPPS

model_utils.Choices

Django, DRF-Benutzer Verwenden Sie model_utils.Choices? Wir verwenden es bequem, aber im Grunde verwenden wir es oft für die Statusverwaltung.

Ist es so

class News(models.Model):
    STATUS = Choices(
        ('DRAFT',     'Entwurf'),
        ('CHECK',     'Auf eine Rückmeldung warten'),
        ('PUBLISHED', 'Veröffentlichung'),
    )

    status = StatusField(
        choices_name='STATUS',
        help_text="Status",
        default=STATUS.DRAFT,
    )

    title = models.CharField(
        max_length=1024,
        null=False,
        blank=False,
        default="",
        help_text="Nachrichtentitel"
    )

    body = models.TextField(
        null=False,
        blank=False,
        default="",
        help_text="News Details"
    )

Wofür wird die Erklärung (VALUE) of Choice verwendet?

In Choice können Sie KEY und seine Beschreibung definieren (KEY ist in der Datenbank gespeichert), aber ich bin mir nicht sicher, wie ich diese Beschreibung verwenden soll. Ist es nicht in Ordnung zu kommentieren? Ich fühle mich wie. Wenn dieses Auswahlfeld wie beim Serializer ausgegeben wird, wird nur KEY ausgegeben, sodass die Erklärung (VALUE) nicht verwendet werden kann.

Verwendung von VALUE

Wenn im Beispiel von ↑ beispielsweise ein Verwaltungsbildschirm vorhanden ist, auf dem Nachrichten verwaltet werden, möchten Sie möglicherweise den Status in der Liste anzeigen oder nach Status suchen. Auf diesem Bildschirm möchten Sie "Entwurf" oder "Öffentlich" anstelle von "ENTWURF" oder "VERÖFFENTLICHT" verwenden.

In solchen Fällen scheint es dumm zu sein, jeden Programmierer so zu implementieren, dass KEY und VALUE in der Ausgabeserialisierung von Choice zurückgegeben werden. Daher erstellen und betreiben wir eine solche Erweiterung.

class MyChoiceField(serializers.ChoiceField):
    def to_representation(self, obj):
        choice = getattr(self, '_choices')
        key = str(obj)
        if key in choice:
            return {'key': key, 'val': choice[key]}
        else:
            return {'key': key, 'val': ''}


class MyModelSerializer(serializers.ModelSerializer):
    """
Schreiben Sie Felder neu, die automatisch zum Serializer erweitert werden
    """
    serializer_choice_field = MyChoiceField

Jeder Serializer erbt von MyModelSerializer.

class NewsSerializer(MyModelSerializer):
    class Meta:
        model = News
        fields = "__all__"

Jetzt gibt status Schlüssel und Wert aus.

Recommended Posts

Verwenden Sie Modelle utils.Choices bequem TIPPS
Verwenden Sie prefetch_related bequem mit Django
Pandas / DataFrame-Tipps für den praktischen Gebrauch