【发布时间】:2016-03-26 15:58:21
【问题描述】:
所以我的数据库结构有点复杂,有很多 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)
以下是我为 Subject 和 Unit 模型编写的序列化程序类
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
最后是网址:
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。有什么帮助吗??
【问题讨论】:
标签: django django-models many-to-many django-rest-framework