【问题标题】:many_init takes exactly 1 argument (3 given) django rest frameworkmany_init 只需要 1 个参数(给定 3 个)django rest 框架
【发布时间】: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


    【解决方案1】:

    查看您的无效代码class UnitSerializer(serializers.PrimaryKeyRelatedField):

    docs 那里,您必须使用以下之一 -

    serializers.ModelSerializer
    serializers.HyperlinkedModelSerializer
    serializers.ListSerializer
    serializers.BaseSerializer
    

    您正在尝试将字段序列化程序传递给序列化程序“视图”。

    【讨论】:

    • 现在我想哭了..我一直在检查我的代码几次,但完全看清了那个错字..我不相信..我想一双新的眼睛总是有帮助的..非常感谢..
    • 它被我抓了很多次了,不用担心 :) 我在打字时开始提出一个 SO 问题的次数,“哦,这就是问题所在”。哈哈哈
    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2014-09-04
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多