【问题标题】:Django test: Residence() got an unexpected keyword argument 'hotel_id'Django 测试:Residence() 有一个意外的关键字参数“hotel_id”
【发布时间】:2021-12-19 15:24:08
【问题描述】:
  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()

我想加入两个模型(酒店和住宅)然后发布。我写了以下代码:

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() got an unexpected keyword argument 'hotel_id'。有人可以帮我吗?

【问题讨论】:

  • 请添加您的输入数据(例如来自网络浏览器/邮递员)

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


【解决方案1】:

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`.
 

HyperlinkedModelSerializerModelSerializer 之间的区别在于序列化程序由 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"
        }
    ]

【讨论】:

  • 它不起作用
  • @Roro 你能把id从住宅模型中的hotel_id中删除吗?
  • 写简单的hotel = model.ForeignKey(Hotel, so on)
  • 当我尝试运行 python manage.py makemigrations 时出现错误:ImportError: cannot import name 'contextmanage' from 'contextlib' –
猜你喜欢
  • 2016-09-12
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 2012-11-06
  • 2021-10-29
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多