2015-03-16 2 views
1

Я хочу, чтобы мой отдых api мог добавлять объекты, но есть твист.Как я могу заставить идентификатор пользователя как значение при работе с фреймворком django rest?

В моей модели есть поле, которое называется user, которое может быть None для анонимных пользователей или идентификатором того, кто его устанавливает.

Как я могу обеспечить это элегантным способом?

Также, если поле user равно None Я хочу, чтобы идентификатор нового объекта хранился в массиве в сеансе анонимных пользователей, поэтому он может быть назначен, если он когда-либо решает зарегистрироваться.

Вот как я создал Viewset:

class PointAPIView(viewsets.ModelViewSet): 
    queryset = Point.objects.all() 
    serializer_class = PointSerializer 
    permission_classes = (IsOwnerOrReadOnly,) 

Я подозреваю, что я должен написать пользовательский метод создания является то, что правильно? Если да, то как это должно выглядеть? В документации только говорится, что она есть, но не то, как она должна быть структурирована и что ей нужно вернуть. Можете ли вы показать мне пример фиктивного метода, где я могу поместить свою логику?

Благодарим вас за внимание!

EDIT: Потому что кто-то спросил. Модель будет выглядеть примерно так:

class Point(models.Model): 
    user = models.ForeignKey('auth.User') 
    value = models.IntegerField() 

Теперь вопрос, как я могу заставить user поле быть request.user при создании точечного объекта через апи покоя.

+0

Вы можете включать в свои модели в вашем вопросе? В настоящее время его трудно ответить, не имея другого контекста для работы. –

+0

Извините, если вопрос не был на 100% понятным. Я добавил краткий пример модели. Теперь есть модель с пользовательским полем. Я хочу, чтобы это поле было request.user, когда создание выполняется поверх остальных api. – JasonTS

ответ

0

В вашем PointSerializer переопределите метод create и получите объект запроса, чтобы извлечь текущего пользователя и назначить его созданной точке.

class PointSerializer(serializers.ModelSerializer): 
    //point fields 

    class Meta: 
      model = Point 
      fields = ('value','user') 

    def create(self,validated_data): 
     request = request = self.context['request'] 
     user = request.user 
     point = Point.objects.create(value=validated_data['value']) 
     point.user = user 
     point.save() 
     return point 
0

не уверен, если вы можете nodify validated_data, если не вы должны скопировать его

def create(self, validated_data): 
    request = self.context['request'] 
    user = request.user 

    if user.is_authenticated(): 
     validated_data.update({ 
      'user': user.id 
     }) 

    point = Point.objects.create(**validated_data) 

    return point