Тест Django: Residence() получил неожиданный аргумент ключевого слова 'hotel_id'

  class Hotel (models.Model):
  name = models.CharField()
  country = models.CharField()
  city = models.CharField()
  street = models.CharField() 


 class Residence(models.Model):
  hotel_id = models.ForeignKey(Hotel, on_delete=models.DO_NOTHING, related_name='hotel')
  house_number = models.CharField()

Я хочу объединить две модели (Hotel и Residence) и затем опубликовать их. Я написал следующий код:

serializers.py

 class HotelSerializer(serializers.HyperlinkedModelSerializer):
  class Meta:
    model = Hotel
    fields = ['name', 'country', 'city', 'street']


class ResidenceSerializer(serializers.HyperlinkedModelSerializer):
 hotel_id = HotelSerializer()

 class Meta:
  model = Residence
  fields = ['house_number', 'hotel_id'] 
 
 def create(self, validated_data):
    return Residence.objects.create(**validated_data)
 
views.py

 class ResidenceViewSet(viewsets.ModelViewSet):
 serializer_class = ResidenceSerializer
 queryset = Residence.objects.all()  
 

Когда я пытаюсь опубликовать данные в своем api, я получаю следующую ошибку: Residence() получил неожиданный аргумент ключевого слова 'hotel_id'. Кто-нибудь может мне помочь?

Замена hotel_id на hotel. И все же, вы можете передать отель из вида

class ResidenceSerializer(serializers.HyperlinkedModelSerializer):
 hotel = HotelSerializer()

 class Meta:
  model = Residence
  fields = ['house_number', 'hotel'] 

Also if you are not interested in hyper links(urls) then replace 
`serializers.HyperlinkedModelSerializer` with `serializers.ModelSerializer`.
 

Разница между HyperlinkedModelSerializer и ModelSerializer является сериализатором размещено здесь Serjik

Простой пример:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups')


class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ('url', 'name')

bash> http -a admin:yourpassword http://127.0.0.1:8000/users/

 "results": [
        {
            "email": "admin@min.com",
            "groups": [
                "http://127.0.0.1:8000/groups/1/",
                "http://127.0.0.1:8000/groups/2/"
            ],
            "url": "http://127.0.0.1:8000/users/1/",
            "username": "admin"
        }
    ]

Но если вы измените

class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('url', 'username', 'email', 'groups')

Результатом будет:

   "results": [
        {
            "email": "admin@min.com",
            "groups": [
                1,
                2
            ],
            "url": "http://127.0.0.1:8000/users/1/",
            "username": "admin"
        }
    ]
Вернуться на верх