Создание объекта с django rest api со ссылкой на внешний ключ - PullRequest
0 голосов
/ 14 декабря 2018

Извините, если это было задано, но я перерыл документацию и даже несколько других вопросов StackOverflow, и, похоже, ни один из них не решил мою проблему.Я немного новичок в Django, так что извините, если на этот вопрос ответили где-то еще.

( Django REST - создание объекта с внешним ключом с использованием сериализаторов ). Просто выполнение company_id, как было предложено здесь,не работа.Все еще не туда добраться.Также попробовал пользовательскую функцию создания в представлении, как это было предложено, и мне тоже не повезло.

У меня есть класс Company с 2 значениями (id 1 и 2) и класс Project, который содержитвнешний ключ company_id обратно на Company.Project должно иметь ровно 1 Company.

. Сейчас я не могу выполнить POST для создания Project.Я пытался ссылаться на company_id специально и даже пытался ссылаться на вложенные сериализаторы в сериализаторе.Кажется, ничего не работает.

Я бы, вероятно, предпочел бы отправить company_id в сообщениях POST и вернуть объект, на который ссылаются, когда я получу.На данный момент, я был бы счастлив получить POST для работы.Примечание. Значение по умолчанию company_id равно 1, поэтому первое, что я создаю, будет работать.Просто все последующие сообщения POST приводят к этой ошибке: (1062, "Duplicate entry '1-RANDOM' for key 'project_project_company_id_key_007f87f8_uniq'")

Company

# Model
from django.db import models

class Company(models.Model):
    company = models.CharField(
        max_length=50,
        unique=True
    )


# Serializer
from rest_framework import serializers
from api.company.models import Company

class CompanySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Company
        fields = ('url', 'company')


# View
from rest_framework import viewsets

from api.company.serializers import CompanySerializer
from api.company.models import Company


class CompanyViewSet(viewsets.ModelViewSet):
    queryset = Company.objects.all()
    serializer_class = CompanySerializer

Project

# Model
from django.db import models
from django.core.validators import RegexValidator

from api.company.models import Company


class Project(models.Model):
    DEFAULT_PK = 1

    class Meta:
        unique_together = (('company', 'key'),)

    company = models.ForeignKey(
        Company,
        on_delete=models.CASCADE,
        default=DEFAULT_PK,
        blank=False
    )
    key = models.CharField(
        max_length=8,
        blank=False,
        validators=[
            RegexValidator(
                regex='^[A-Z0-9\-]*$',
                message='Project key can only contain uppercase alphanumeric or a hythen (-)',
                code='invalid_key'
            ),
        ]
    )
    name = models.CharField(
        max_length=50,
        blank=False
    )
    description = models.CharField(
        max_length=500,
        blank=True
    )


# Serializer
from rest_framework import serializers
from api.project.models import Project

from api.company.serializers import CompanySerializer


class ProjectSerializer(serializers.HyperlinkedModelSerializer):
    #company = CompanySerializer(read_only=True) # Tried this to no avail.

    class Meta:
        model = Project
        fields = ('url', 'key', 'name', 'description', 'company_id') # 'company' here did not work

# View
from rest_framework import viewsets
from rest_framework.response import Response

from api.project.serializers import ProjectSerializer
from api.project.models import Project
from api.project.models import Company


class ProjectViewSet(viewsets.ModelViewSet):
    queryset = Project.objects.all()
    serializer_class = ProjectSerializer

# Tried playing around with this from suggestion I find in other post. No luck
"""
def create(self, validated_data):
    serializer = self.get_serializer(data=self.request.data)
    company_id_for_contact =  self.request.data.pop('company_id')
    company_instance = Company.objects.filter(id=company_id_for_contact).first()
    if not serializer.is_valid():
        print(serializer.errors)
    data = serializer.validated_data
    serializer.save(company=company_instance)
    headers = self.get_success_headers(serializer.data)
    return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
"""

Данные

# Note: the first one will work (default company_id is 1. Next one will not)
curl \
 -X POST \
 -H 'Content-Type: application/json' \
 -d '{"company_id":2,"key":"OTHER","name":"Other","description":"Other example."}' \
'http://0.0.0.0:8000/project/'

1 Ответ

0 голосов
/ 15 декабря 2018

Ух ты, я должен был задержать еще 10 минут, и я бы понял это.Завитку POST нужно company, а не company_id.Ссылка CompanySerializer не требуется в Project.

Нам просто нужно сослаться на url (http://0.0.0.0:8000/company/2/), так как я использую HyperlinkedModelSerializer.

Надеюсь, кто-то найдет этопока есть похожая проблема:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...