django - Many_init 恰好需要 1 个参数(给定 3 个参数) django Rest Framework

标签 django django-models many-to-many django-rest-framework

所以我有稍微复杂的数据库结构和相当多的 m2m 关系。我面临着这个问题,一些 View 集是在几个结构非常相似的表上定义的。以下是一些示例模型。

# 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')

以下是为上述两个序列化器定义的 View 集

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。有什么帮助吗??

最佳答案

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

按照 docs 进行操作在那里你必须使用以下之一 -

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

您正在尝试将字段序列化器传递到序列化器“ View ”中。

关于django - Many_init 恰好需要 1 个参数(给定 3 个参数) django Rest Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34381077/

相关文章:

python - django 中的 get_user_model() 、settings.AUTH_USER_MODEL 和 USER 有什么区别?

c# - EF Core 中的多对多关系映射

sql - MySQL 多对多查询问题

java - 如何在 Hibernate 中删除多对多关系中的实体

python - 在 html 页面中填写注册表单后,出现此错误并使用用户名和密码并将值存储在登录表单中

python - 将可编辑字段作为 Django-Rest-Framework Serializer 的validated_data 方法传递

django - 为什么 Django 中的只读表单域不是一个好主意?

python - 'getattr() : attribute name must be string' error in admin panel for a model with an ImageField

javascript - Django Ajax 未进入函数

javascript - 解析 Django 中 querydict 字典中的整个列表