Django 超链接相关字段 read_only False 给出查询集错误



狗模型有一个字段"cat"

class Dog(models.Model):
    ...
    cat = models.ForeignKey(Cat)
    ...
class CatSerializer(serializers.HyperlinkedModelSerializer):      
    class Meta:
        model = Cat
        # Replace ID with SLUG in urls
        lookup_field = 'slug'
        fields = ('url', 'slug')
        extra_kwargs = {
            'url': {'lookup_field': 'slug'}
        }
class DogSerializer(serializers.HyperlinkedModelSerializer):
    cat= serializers.HyperlinkedRelatedField(
        view_name='cat-detail',
        lookup_field='slug',
        many=False,
        read_only=True
    )
    class Meta:
        model = Dog
        fields = ('url', 'slug', 'cat')
        lookup_field = 'slug'
        extra_kwargs = {
           'url': {'lookup_field': 'slug'}
        }

class CatViewSet(viewsets.ModelViewSet):
    def get_serializer_context(self):
        context = super().get_serializer_context()
        context['slug'] = self.kwargs.get('slug')
        return context
    queryset = Cat.objects.all()
    serializer_class = CatSerializer
    lookup_field = 'slug'
class DogViewSet(viewsets.ModelViewSet):
    queryset = Dog.objects.all()
    lookup_field = 'slug'
    serializer_class = DogSerializer

router = routers.DefaultRouter()
router.register(r'cats', rest_views.CatViewSet)
router.register(r'dogs', rest_views.DogViewSet)

如何设置:

read_only=False

将其设置为 False 时出现的错误是:

"关系字段必须提供一个queryset的论据," 断言错误:关系字段必须提供queryset参数、覆盖get_queryset或设置 read_only= True

cat= serializers.HyperlinkedRelatedField(
    view_name='cat-detail',
    lookup_field='slug',
    many=False,
    read_only=False,
    queryset=Cat.objects.all()
)

这工作得很好。

最新更新