无法使用视图名称解析超链接关系的网址" itemimages-detail"

时间:2015-05-08 21:09:06

标签: django django-rest-framework


我曾经有一个图片字段,我想将其更改为多个图片字段: 我有

picture = models.ImageField(null=True, blank=True, upload_to="items")

所以我创建了一个新模型:

class ItemImages(models.Model):
    itemImage = models.ForeignKey(Item, related_name='pictures')
    image = models.ImageField(null=True, blank=True, upload_to="items")

之后,我创建了视图集:(请注意我不知道我在做什么

class ItemImagesViewSet(viewsets.GenericViewSet):
    for_model = Item
    queryset = Item.objects.all()
    serializer_class = ItemImagesSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwnerOrReadOnly)

然后网址转:

router = ExtendedSimpleRouter()
...
(
    router.register(r'items', ItemViewSet)
          .register(r'itemimages', ItemImagesViewSet, 'items-images', parents_query_lookups=['items']) # I added this line 
          .register(r'reviews',
                    ItemReviewViewSet,
                    'items-review',
                    parents_query_lookups=['content_id'])
)

我的序列化器:

from rest_framework import serializers
from django.utils.translation import ugettext_lazy as _

from inventory.models import Item, ItemImages
from users.api.serializers import ObjectReviewsSerializer


class ItemSerializer(ObjectReviewsSerializer):
    class Meta:
        model = Item
        fields = (
            'category', 'id', 'pictures', 'created', 'title',
            'url', 'value', 'user', 'reviews_url', 'rating', 'description'
        )
        read_only_fields = ('user', 'created', 'modified', '')

    def create(self, validated_data):
        validated_data.update({
            'user': self.context['request'].user,
        })
        return super(ItemSerializer, self).create(validated_data)

    def validate(self, attrs):
        more_fee = attrs.get('more_fee', None)
        less_fee = attrs.get('less_fee', None)
        if not more_fee and not less_time_fee and not self.instance:
            msg = _('You should provide either a more fee or a less  fee')
            raise serializers.ValidationError(msg)
        return attrs


class ItemImagesSerializer(ObjectReviewsSerializer):
    class Meta:
        model = ItemImages

当我要求/items/23时,它会在标题中说明错误 我知道我做错了很多但是我不知道是什么和为什么 我一般是Django Rest和Django的新手,我正在玩一个现有的项目(尝试将一张图片更改为多张)

完整的错误消息:

  

/ api / v1 / items / 23 /中的不正确配置无法解析   使用视图名称" itemimages-detail"的超链接关系。你可以   未能在您的API中包含相关模型,或者不正确   在此字段上配置了lookup_field属性。

1 个答案:

答案 0 :(得分:2)

您使用“items-images”注册“itemimages”作为URLS的基本名称而不是默认的queryset属性名称,这意味着名称为“itemimages-detail”的网址不再存在,而是您的viewset的详细网址将是“items-images-detail”(参见Usage section of the DRF docs)。

由于您也没有为序列化程序指定“图片”字段的字段,因此它将尝试使用默认的ViewLinks“itemimages-detail”的默认HyperLinkRelatedField序列化程序。在ItemSerializer中,您需要为具有正确的非默认view_name的图片指定字段:

pictures = serializers.HyperLinkRelatedField(
    many=True,
    read_only=True,
    view_name='items-images-detail',
)