2017-05-11 4 views
1

J'ai un modèle avec un champ créateur. Je veux que ce champ soit initialisé à la personne qui a créé l'instance du modèle et ne soit pas modifiable plus tard.Définir le créateur automatiquement avec DjangoRestFramework

Le champ créateur ressemble à ceci:

creator = models.ForeignKey(User) 

Et dans le DRF HyperlinkedModelSerializer J'ai ceci:

read_only_fields = ('creator',) 

Maintenant, le problème est que je ne peut évidemment pas créer de nouvelles instances plus depuis la Le champ créateur n'est pas défini. comment puis-je y parvenir?

Une solution possible semble être ce

def create(self, validated_data): 
    validated_data['creator'] = self.context['request'].user 
    return models.MyModel.objects.create(**validated_data) 

Est-ce la voie sèche pour le faire?

Répondre

1

Vous pouvez combiner CreateOnlyDefault et CurrentUserDefault et définir le créateur comme read_only avec une valeur default sur votre sérialiseur:

creator = serializers.HyperlinkedRelatedField(
    read_only=True, 
    default=serializers.CreateOnlyDefault(serializers.CurrentUserDefault()), 
    view_name=... 
) 

Ceci est ma façon préférée de faire cela comme vous le voyez directement à partir de la définition sérialiseur le champ creator est traité spécialement.

+0

Merci, c'est exactement ce dont j'avais besoin. Je ne savais pas que cette combinaison fonctionnerait. – Fabian

+0

Hmm je viens de remarquer que ça ne fonctionne pas vraiment! Oui à la création le créateur est défini, c'est génial. Mais sur mettre et corriger par un utilisateur différent le créateur est mis à jour au dernier utilisateur. Il s'agit donc maintenant d'un champ last_modified_by. – Fabian

+0

Hmm Je pense que ce qui suit est l'implémentation correcte: creator = serializers.HyperlinkedRelatedField (view_name = 'user-detail', read_only = True, par défaut = serializers.CreateOnlyDefault (serializers.CurrentUserDefault())) – Fabian