many_init 恰好接受 1 个参数(给定 3 个)django rest 框架
many_init takes exactly 1 argument (3 given) django rest framework
所以我的数据库结构有点复杂,有很多 m2m 关系。我正面临这个问题,其中一些视图集是在几个结构非常相似的表上定义的。以下是一些示例模型。
# Boards model
class Board(models.Model):
id = models.CharField(max_length=10, primary_key=True)
board = models.CharField(max_length=40, unique=True)
class Meta:
verbose_name_plural = 'Boards'
def __unicode__(self):
return self.board
# Grades model
class Grade(models.Model):
id = models.CharField(max_length=10, primary_key=True)
grade = models.CharField(max_length=40, unique=True)
class Meta:
verbose_name_plural = 'Grades'
def __unicode__(self):
return self.grade
# BoardGrades model
class BoardGrade(models.Model):
board = models.ForeignKey(to=Board)
grade = models.ForeignKey(to=Grade)
class Meta:
verbose_name_plural = 'BoardGrades'
unique_together = ('board', 'grade')
def __unicode__(self):
return '%s - %s' % (self.board.board, self.grade.grade)
# Subjects model
class Subject(models.Model):
id = models.CharField(max_length=5, primary_key=True)
name = models.CharField(max_length=40, unique=True, blank=False, null=False)
board_grade = models.ManyToManyField(to='lguser.BoardGrade')
def_icon = models.ImageField(upload_to='subject_icons', null=True, blank=True)
sel_icon = models.ImageField(upload_to='subject_icons', null=True, blank=True)
class Meta:
verbose_name_plural = 'Subjects'
def __unicode__(self):
return self.name
# Units model
class Unit(models.Model):
name = models.CharField(max_length=100, unique=True, blank=False, null=False)
subject = models.ForeignKey(to=Subject, blank=False, null=False, related_name='units')
board_grade = models.ManyToManyField(to='lguser.BoardGrade')
icon = models.ImageField(upload_to='unit_icons', null=True, blank=True)
class Meta:
verbose_name_plural = 'Units'
def __unicode__(self):
return '%s - %s' % (self.subject.name, self.name)
以下是我为主题和单元模型编写的序列化器类
class SubjectSerializer(serializers.HyperlinkedModelSerializer):
board_grade = serializers.PrimaryKeyRelatedField(queryset=BoardGrade.objects.all(), many=True)
class Meta:
model = Subject
fields = ('name', 'board_grade', 'def_icon', 'sel_icon', 'id', 'url')
class UnitSerializer(serializers.PrimaryKeyRelatedField):
board_grade = serializers.PrimaryKeyRelatedField(queryset=BoardGrade.objects.all(), many=True)
subject = serializers.PrimaryKeyRelatedField(queryset=Subject.objects.all())
class Meta:
model = Unit
fields = ('name', 'subject', 'board_grade', 'icon', 'id', 'url')
下面是为上述两个序列化器定义的视图集
class SubjectViewSet(viewsets.ModelViewSet):
authentication_classes = [JSONWebTokenAuthentication, SessionAuthentication, BasicAuthentication]
permission_classes = [permissions.IsAuthenticated, permissions.IsAdminUser]
queryset = Subject.objects.all()
serializer_class = SubjectSerializer
class UnitViewSet(viewsets.ModelViewSet):
authentication_classes = [JSONWebTokenAuthentication, SessionAuthentication, BasicAuthentication]
permission_classes = [permissions.IsAuthenticated, permissions.IsAdminUser]
queryset = Unit.objects.all()
serializer_class = UnitSerializer
最后 urls:
router = DefaultRouter()
router.register(r'subject', SubjectViewSet)
router.register(r'unit', UnitViewSet)
urlpatterns = router.urls
当我使用 GET 请求点击 /subject/ url 时,它会根据需要为我提供 JSON 数组。但是当我用请求点击 /unit/ url 时,它会抛出如下错误。
TypeError at /lgadmin/unit/
__init__() takes exactly 1 argument (3 given)
Request Method: GET
Request URL: http://127.0.0.1:8000/lgadmin/unit/
Django Version: 1.8.4
Exception Type: TypeError
Exception Value:
__init__() takes exactly 1 argument (3 given)
我看不出问题出在哪里。我尽可能地使用预构建的 ModelViewSet。有帮助吗??
查看您的代码 class UnitSerializer(serializers.PrimaryKeyRelatedField):
无效。
从 docs 那里你必须使用以下之一 -
serializers.ModelSerializer
serializers.HyperlinkedModelSerializer
serializers.ListSerializer
serializers.BaseSerializer
您正在尝试将字段序列化程序传递到序列化程序 "view"。
所以我的数据库结构有点复杂,有很多 m2m 关系。我正面临这个问题,其中一些视图集是在几个结构非常相似的表上定义的。以下是一些示例模型。
# Boards model
class Board(models.Model):
id = models.CharField(max_length=10, primary_key=True)
board = models.CharField(max_length=40, unique=True)
class Meta:
verbose_name_plural = 'Boards'
def __unicode__(self):
return self.board
# Grades model
class Grade(models.Model):
id = models.CharField(max_length=10, primary_key=True)
grade = models.CharField(max_length=40, unique=True)
class Meta:
verbose_name_plural = 'Grades'
def __unicode__(self):
return self.grade
# BoardGrades model
class BoardGrade(models.Model):
board = models.ForeignKey(to=Board)
grade = models.ForeignKey(to=Grade)
class Meta:
verbose_name_plural = 'BoardGrades'
unique_together = ('board', 'grade')
def __unicode__(self):
return '%s - %s' % (self.board.board, self.grade.grade)
# Subjects model
class Subject(models.Model):
id = models.CharField(max_length=5, primary_key=True)
name = models.CharField(max_length=40, unique=True, blank=False, null=False)
board_grade = models.ManyToManyField(to='lguser.BoardGrade')
def_icon = models.ImageField(upload_to='subject_icons', null=True, blank=True)
sel_icon = models.ImageField(upload_to='subject_icons', null=True, blank=True)
class Meta:
verbose_name_plural = 'Subjects'
def __unicode__(self):
return self.name
# Units model
class Unit(models.Model):
name = models.CharField(max_length=100, unique=True, blank=False, null=False)
subject = models.ForeignKey(to=Subject, blank=False, null=False, related_name='units')
board_grade = models.ManyToManyField(to='lguser.BoardGrade')
icon = models.ImageField(upload_to='unit_icons', null=True, blank=True)
class Meta:
verbose_name_plural = 'Units'
def __unicode__(self):
return '%s - %s' % (self.subject.name, self.name)
以下是我为主题和单元模型编写的序列化器类
class SubjectSerializer(serializers.HyperlinkedModelSerializer):
board_grade = serializers.PrimaryKeyRelatedField(queryset=BoardGrade.objects.all(), many=True)
class Meta:
model = Subject
fields = ('name', 'board_grade', 'def_icon', 'sel_icon', 'id', 'url')
class UnitSerializer(serializers.PrimaryKeyRelatedField):
board_grade = serializers.PrimaryKeyRelatedField(queryset=BoardGrade.objects.all(), many=True)
subject = serializers.PrimaryKeyRelatedField(queryset=Subject.objects.all())
class Meta:
model = Unit
fields = ('name', 'subject', 'board_grade', 'icon', 'id', 'url')
下面是为上述两个序列化器定义的视图集
class SubjectViewSet(viewsets.ModelViewSet):
authentication_classes = [JSONWebTokenAuthentication, SessionAuthentication, BasicAuthentication]
permission_classes = [permissions.IsAuthenticated, permissions.IsAdminUser]
queryset = Subject.objects.all()
serializer_class = SubjectSerializer
class UnitViewSet(viewsets.ModelViewSet):
authentication_classes = [JSONWebTokenAuthentication, SessionAuthentication, BasicAuthentication]
permission_classes = [permissions.IsAuthenticated, permissions.IsAdminUser]
queryset = Unit.objects.all()
serializer_class = UnitSerializer
最后 urls:
router = DefaultRouter()
router.register(r'subject', SubjectViewSet)
router.register(r'unit', UnitViewSet)
urlpatterns = router.urls
当我使用 GET 请求点击 /subject/ url 时,它会根据需要为我提供 JSON 数组。但是当我用请求点击 /unit/ url 时,它会抛出如下错误。
TypeError at /lgadmin/unit/
__init__() takes exactly 1 argument (3 given)
Request Method: GET
Request URL: http://127.0.0.1:8000/lgadmin/unit/
Django Version: 1.8.4
Exception Type: TypeError
Exception Value:
__init__() takes exactly 1 argument (3 given)
我看不出问题出在哪里。我尽可能地使用预构建的 ModelViewSet。有帮助吗??
查看您的代码 class UnitSerializer(serializers.PrimaryKeyRelatedField):
无效。
从 docs 那里你必须使用以下之一 -
serializers.ModelSerializer
serializers.HyperlinkedModelSerializer
serializers.ListSerializer
serializers.BaseSerializer
您正在尝试将字段序列化程序传递到序列化程序 "view"。