我想实现一个学生班级系统,任何人都可以创建一个班级,其他人也可以加入。 到目前为止,我有它,所以每个类都有一个创建者和成员。 我正在尝试获取它,以便在用户创建类时他们也会自动添加为成员,但我不确定如何将成员添加到类中。 我能够通过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
我也无法获得每次保存课程以工作时更新成员的代码。