我曾经有一个图片字段,我想将其更改为多个图片字段:
我有
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
属性。
答案 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',
)