【问题标题】:Django Rest Framework- foreign key throwing errorDjango Rest Framework-外键抛出错误
【发布时间】:2019-07-27 09:05:15
【问题描述】:

我正在使用 django rest 框架,其中模型具有复合主键,其中一个是外键。

模型/TestSuite.py

class TestSuite(models.Model):
     team_name = models.ForeignKey('Team', on_delete=models.DO_NOTHING, db_column='team_name')
     suite_name = models.CharField(max_length=100)
     description = models.CharField(max_length=200, blank=True, null=True)
     schedule = models.CharField(max_length=100, blank=True, null=True)
     email_list_ok = models.CharField(max_length=200, blank=True, null=True)
     email_list_fail = models.CharField(max_length=200, blank=True, null=True)
     template_name = models.ForeignKey('EmailTemplates', on_delete=models.DO_NOTHING, db_column='template_name')

class Meta:
    managed = False
    db_table = 'test_suite'
    unique_together = (('team_name', 'suite_name'),)

models/Team.py

class Team(models.Model):
    team_name = models.CharField(primary_key=True, max_length=30)
    description = models.CharField(max_length=100, blank=True, null=True)

class Meta:
    managed = False
    db_table = 'team'

TestSuiteSerializer.py

class Meta:
    model = models.TestSuite
    fields = '__all__'

TestSuiteViewSet.py

class TestSuiteViewSet(viewsets.ModelViewSet):
    queryset = models.TestSuite.objects.all()
    serializer_class = serializers.TestSuiteSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data,
                                     many=isinstance(request.data, list))
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data,
                    status=status.HTTP_201_CREATED, headers=headers)

现在当我发出一个帖子请求时,它会抛出以下错误

当 post() 的 team_name 已经存在于团队表中时

{
    "team_name": [
        "test suite with this team name already exists."
    ]
}

当 post() 的 team_name 不存在于团队表中时

Exception Type:	ValueError
Exception Value:	
Cannot assign "'dummy'": "TestSuite.team_name" must be a "Team" instance.

有人可以在这里帮助我吗?我假设我错过了什么。

【问题讨论】:

    标签: django django-models django-rest-framework foreign-keys


    【解决方案1】:

    外键字段的第一个参数应该是模型本身,而不是模型的字符串(例如,不是“团队”,而是团队 - 对于 EmailTemplate 也是如此)

     class TestSuite(models.Model):
         # Change this field's first argument from a string to the Team class
         team_name = models.ForeignKey(Team, on_delete=models.DO_NOTHING, db_column='team_name')
         suite_name = models.CharField(max_length=100)
         description = models.CharField(max_length=200, blank=True, null=True)
         schedule = models.CharField(max_length=100, blank=True, null=True)
         email_list_ok = models.CharField(max_length=200, blank=True, null=True)
         email_list_fail = models.CharField(max_length=200, blank=True, null=True)
         # Change this field's first argument from a string to the EmailTemplates class
         template_name = models.ForeignKey(EmailTemplates, on_delete=models.DO_NOTHING, db_column='template_name')
    
         class Meta:
             managed = False
             db_table = 'test_suite'
             unique_together = (('team_name', 'suite_name'),)
    

    【讨论】:

    • TestSuite 的 PK 是 ('team_name', 'suite_name')。如果不将主键分配给其中一个文件夹,请求将失败。 (1054,“'字段列表'中的未知列'test_suite.id'”)如果我为team_name和/或suite_name设置primarykey = True,它会像问题中提到的那样失败。
    • 文件夹是什么意思? TestSuite 在您的模型中没有任何主键,只有您的唯一约束('team_name','suite_name')。我不是建议对您的主键进行任何更改,只是您没有正确配置外键字段。进行我上面建议的更改,这将起作用。
    • 更新了我的答案以帮助您理解
    • 文件夹是一个错误,我的意思是团队。我按照您的建议进行了上述更改, get() post() 有效。但是,当我单击可浏览 api 时,它现在会显示错误。异常值:(1054,“'字段列表'中的未知列'test_suite.id'”)
    • class TestSuiteSerializer(serializers.ModelSerializer): id = serializers.ReadOnlyField() class Meta: model = TestSuite fields = ('id', 'team_name', 'suite_name', 'description', 'schedule '、'email_list_ok'、'email_list_fail'、'template_name')
    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 2017-08-15
    • 2019-07-02
    • 2016-01-09
    • 2015-03-27
    • 2021-06-25
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多