Ich versuche das Tutorial von DRF und ich fand etwas verwirrt. ich ein User-Modell haben die auth.User erstreckt einfach wie diesedjango rest framework wie man benötigte Felder pro ViewSet Aktion definiert
class User(DefaultUser):
"""
Represents a registered User
"""
EMAIL_VALIDATOR_LENGTH = 6
email_validated = models.BooleanField(default=False)
# using a 6-digit numbers for email validation
email_validator = models.CharField(
max_length=6,
default=_get_random_email_validator(EMAIL_VALIDATOR_LENGTH),
editable=False
)
phone_number = models.CharField(validators=[phone_regex],
blank=True, null=True, max_length=64)
# country is required
country = models.ForeignKey('Country', null=False, blank=False)
# subdivision is optional
subdivision = models.ForeignKey('Subdivision', null=True, blank=True)
Dann habe ich meine Grund UserSerializer:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'email', 'password', 'email_validated',
'email_validator', 'country', 'subdivision', 'phone_number',
'last_login', 'is_superuser', 'username', 'first_name',
'last_name', 'is_staff', 'is_active', 'date_joined')
In meinem views.py habe ich UserViewSet:
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
@detail_route(methods=['get', 'post'], url_path='validate-email')
def validate_email(self, request, pk):
user = self.get_object()
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
user.is_active = True
user.save()
return Response({'status': 'email validated'})
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@detail_route(methods=['post'], url_path='set-password')
def set_password(self, request, pk):
pass
@list_route()
def test_list_route(self, request):
pass
Das Problem ist, in validate_email, ich brauche eigentlich nur pk, aber wenn ich die API testen, sagte mir, dass Benutzername und E-Mail ebenfalls erforderlich sind.
Ich fügte dann folgenden Code zu meinem UserSerializer
extra_kwargs = {'country': {'required': False},
'password': {'required': False},
'username': {'required': False},
}
nun das oben genannten Problem ist weg, aber wenn ich einen Benutzer zu schaffen versucht, ich will eigentlich Benutzername und E-Mail erforderlich.
Gibt es eine Möglichkeit, dass ich angeben kann, welche Felder pro Aktion benötigt werden? Zum Beispiel, für meine set_password(), möchte ich das Passwort-Feld erfordern.
Danke,
danke für Ihre Antwort, aber ich denke, es funktioniert nicht. Ich füge folgenden Code zu meinem UserSerializer hinzu und benötige immer noch den Benutzernamen: self.fields ['username']. Require = False –