Django Rest API 将成员(用户)添加到类模型中



我想实现一个学生班级系统,任何人都可以创建一个班级,其他人也可以加入。 到目前为止,我有它,所以每个类都有一个创建者和成员。 我正在尝试获取它,以便在用户创建类时他们也会自动添加为成员,但我不确定如何将成员添加到类中。 我能够通过python shell做到这一点,但不能通过api在类视图中做到这一点。

最终,我希望你能够转到/auth/classes//join 并让该用户加入该类以及/auth/classes//leave。 任何帮助都非常感谢:)

model.py

class Class(models.Model):
name = models.CharField(max_length=30)
class_discription = models.CharField(max_length=30)
created = models.DateTimeField(auto_now_add=True) 
creator = models.ForeignKey('users.User', related_name='creator', on_delete=models.CASCADE)
members = models.ManyToManyField('users.User')  
class Meta:
ordering = ['created']

def addMember(self, *vars, **kwargs):
self.membebrs.add(User)
return super().save(*vars, **kwargs)
def deleteMember(self, *vars, **kwargs):
self.membebrs.remove(User)
return super().save(*vars, **kwargs)

view.py

from django.contrib.auth.models import Group
from rest_framework import viewsets
from classes.serializers import ClassSerializer
from rest_framework import permissions
from rest_framework.response import Response
from classes.models import Class
from rest_framework.decorators import action
from rest_framework import status, viewsets
from users.models import User
# Create your views here.
class ClassViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows classes to be viewed or edited.
"""

queryset = Class.objects.all().order_by('-name')
permission_classes = [permissions.AllowAny]
serializer_class = ClassSerializer
def perform_create(self, serializer):
user = self.request.user
serializer.save(creator=user)

serializer.py

from rest_framework import serializers
from rest_framework.authtoken.models import Token
from classes.models import Class
from users.serializers import UserSerializer

class ClassSerializer(serializers.HyperlinkedModelSerializer):
creator = UserSerializer(many=False, required=False)
members = UserSerializer(many=True, required=False)
class Meta:
model = Class
fields = ['name', 'id', 'creator', 'members']

你快到了:

class ClassViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows classes to be viewed or edited.
"""

queryset = Class.objects.all().order_by('-name')
permission_classes = [permissions.AllowAny]
serializer_class = ClassSerializer
def perform_create(self, serializer):
obj = serializer.save()
obj.creator = self.request.user
obj.save()

请注意,您无需提交任何创建者对象。因此,您无法提交如下有效负载:

{
"creator": {
"username": "",
},
"members": [],
"name" : "This Does NOT work"
}

因为那样创建者将被验证并失败。创建新类时,有效负载中需要缺少 Creator:

{
"members": [],
"name": "This should work"
}

将创建者添加到save设置的members中是否有效?像这样的东西...

class Class(models.Model):
name = models.CharField(max_length=30)
class_discription = models.CharField(max_length=30)
.
.
def save(self, **kwargs):
if not self.pk:
self.members.add(self.creator)

感谢您的回复,我将 views.py 更改为如下所示:

# Create your views here.
class ClassViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows classes to be viewed or edited.
"""

queryset = Class.objects.all().order_by('-name')
permission_classes = [permissions.AllowAny]
serializer_class = ClassSerializer
def perform_create(self, serializer):
obj = serializer.save()
obj.members.add(self.request.user)
obj.save()

但是它仍然抛出一个错误,我理解错了吗?

IntegrityError at /api/classes/
NOT NULL constraint failed: classes_class.creator_id
Request Method: POST
Request URL: http://127.0.0.1:8000/api/classes/
Django Version: 3.0.7

我也无法获得每次保存课程以工作时更新成员的代码。

最新更新