Django Rest Framework - ошибка метания внешнего ключа - PullRequest
0 голосов
/ 05 марта 2019

Я использую среду отдыха django, в которой модель имеет составной первичный ключ, один из которых является внешним ключом.

Модели / 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'),)

Модель / 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.

Может кто-нибудь, пожалуйста, помогите мне здесь. Я предполагаю, что что-то упустил.

1 Ответ

0 голосов
/ 05 марта 2019

Первым аргументом для полей внешнего ключа должна быть сама модель, а не строка модели (например, не «Team», а Team - аналогично для 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'),)
...