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"
)
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.
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.