【问题标题】:Creating an object with django rest api referencing a foreign key使用引用外键的 django rest api 创建对象
【发布时间】:2018-12-14 20:54:34
【问题描述】:

很抱歉,如果有人问过这个问题,但我已经研究了文档,甚至还有其他一些 StackOverflow 问题,但似乎没有一个可以解决我的问题。我对 Django 有点陌生,如果在其他地方回答了这个问题,我很抱歉。

(Django REST - Create object with foreign key using serializers) 只是按照这里的建议做 company_id 是行不通的。仍然没有到达那里。 还按照建议尝试了视图中的自定义创建功能,但也没有运气。

我有一个带有 2 个值(id 1 和 2)的 Company 类和一个包含外键 company_idProject 类返回到 CompanyProject 必须正好有 1 个 Company

现在,我无法通过 POST 来创建 Project。我已经尝试专门引用company_id,甚至尝试在序列化程序中引用嵌套序列化程序。似乎没有任何效果。

我可能更愿意在 POST 中发送 company_id,并在 GET 时取回引用的对象。不过,在这一点上,我很乐意让 POST 工作。注意:默认的company_id 值是1,所以我创建的第一个实际上可以工作。只是所有后续的 POST 最终都会给出这个错误: (1062, "Duplicate entry '1-RANDOM' for key 'project_project_company_id_key_007f87f8_uniq'")

公司

# 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

项目

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

【问题讨论】:

    标签: django django-models django-rest-framework django-serializer


    【解决方案1】:

    哇,我应该再拖延 10 分钟,然后我就会想出来的。 curl POST 需要company,而不是company_idProject 中不需要 CompanySerializer 引用。

    我们只需要引用url(http://0.0.0.0:8000/company/2/),因为我使用的是HyperlinkedModelSerializer

    希望有人在遇到类似问题时发现这个:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2019-01-17
      • 1970-01-01
      相关资源
      最近更新 更多