Django 2.1 создать метод для создания вложенных полей (отношение иностранных ключей).Использование Django's Rest Framework - PullRequest
0 голосов
/ 13 февраля 2019

Какой метод я должен использовать в jango 2.1 для метода create, чтобы добавить новые объекты, которые также поддерживают создание вложенных полей (отношение ForeignKey).Я всегда получаю сообщение об ошибке:

AssertionError в / client / create / Метод .create() не поддерживает записи вложенных полей по умолчанию.

ПользовательМодель

class User(models.Model):
gender = models.CharField(max_length=10, choices=GENDER)
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
position = models.CharField(max_length=50)
birthday = models.DateField(auto_created=False)
email = models.EmailField(max_length=50)
phone = models.CharField(max_length=15)
password = models.CharField(max_length=100)

def __str__(self):
    return f"{self.first_name} {self.last_name} {self.position} {self.email} {self.phone} {self.password}"

Модель компании

class Company(models.Model):
company_name = models.CharField(max_length=50, blank=False)
address = models.CharField(max_length=50, blank=False)
zip = models.IntegerField(blank=False)
city = models.CharField(max_length=50, blank=False)
email = models.EmailField(max_length=50, blank=False)

def __str__(self):
    return f"{self.company_name} {self.address} {self.zip} {self.city}"

Компания-клиент

class ClientCompany(models.Model):
client = models.ForeignKey(Company, on_delete=models.PROTECT)
contact_person = models.ForeignKey(User, on_delete=models.PROTECT)
status = models.CharField(max_length=15, choices=STATUS, default='Aktiv')

def __str__(self):
    return f"{self.client} {self.contact_person} {self.status}"

Сериализатор пользователя

class UserSerializer(serializers.ModelSerializer):
class Meta:
    model = User
    fields = '__all__'

ClientCompanySerializer

class ClientCompanySerializer(serializers.ModelSerializer):
    client = CompanySerializer(many=False, read_only=False)
    contact_person = ClientUserSerializer(many=False, read_only=True)

    class Meta:
        model = ClientCompany
        fields = '__all__'

UserUrls

    urlpatterns = [
path('update/id<int:id>', UpdateUserByID.as_view(), name='user-update'),
path('id/<int:id>', GetUserByID.as_view(), name='user-id'),
path('create', CreateUser.as_view(), name='create-user'),
path('delete/id/<int:id>', DeleteUserByID.as_view(), name='delete-user'),

]

CompanyUrls

urlpatterns = [
path('update/id<int:id>', CompanyUpdateByID.as_view(), name='company-udpate'),
path('id/<int:id>', CompanyById.as_view(), name='company-id'),
path('create/', CreateCompany.as_view(), name='company-create'),
path('delete/id/<int:id>', DeleteCompanyByID.as_view(), name='company-delete')

]

CompanyView

class CreateCompany(generics.CreateAPIView):
queryset = Company.objects.all()
serializer_class = CompanySerializer

Моя цель - создать новую компанию(и связанный с ним fk 'contact_person') в URL / company / create /

Есть ли способ создать связанный 'contact_person' в 'ClientCompanySerializer' или мне следует использовать другой подход.

1 Ответ

0 голосов
/ 13 февраля 2019

вам необходимо переопределить методы create и update по умолчанию в сериализаторах, как показано ниже:

сначала удалить read_only=True из contact_person

def create(self, validated_data):
client = validated_data.pop('client')
contact_person = validated_data.pop('contact_person')
client_instance = Company.object.create(**client)
contact_person_instance = User.object.create(**contact_person)
return ClientCompany.objects.create(client=client_instance,contact_person=contact_person_instance , **validated_data)

, также реализоватьаналогичный метод для update

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