首页 > 解决方案 > Django REST Framework 在序列化程序中创建外键对象

问题描述

您好,我是 REST 框架的新手。如果在我创建新商店时它不存在,我正在尝试让我的序列化程序创建新城镇。

class ShopSerializer(serializers.HyperlinkedModelSerializer):

    town = serializers.SlugRelatedField(slug_field='town', queryset=Town.objects.all())
    # town_send = serializers.CharField(max_length=50, write_only='True')

    class Meta:
        model = Shop
        fields = ('name', 'address', 'opening_hour', 'closing_hour', 'owner', 'geo_point', 'town', 'url')
        read_only_fields = ('owner',)


    def create(self, validated_data):
        request = self.context['request']
        owner = request.user
        town = validated_data.pop('town')
        town, exist = Town.objects.get_or_create(town=town)
        shop = Shop.objects.create(owner=owner, town=town, **validated_data)
        return shop

目前,如果我将现有城镇名称发送给它,它会更新,但是当我给它新城镇时,它会显示:“具有字段 town=x 的对象不存在”

编辑:

模型:

class Shop(models.Model):
    name = models.CharField(verbose_name='name', max_length=100)
    town = models.ForeignKey('Town', verbose_name='town', on_delete=models.CASCADE, related_name='shops')
    address = models.CharField(verbose_name='address', max_length=100)
    opening_hour = models.TimeField(verbose_name='opening')
    closing_hour = models.TimeField(verbose_name='closing')
    photo = models.ImageField(verbose_name='photo', upload_to='photos', blank=True)
    geo_point = PointField(verbose_name='coordinates')
    owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='owner', related_name='shops')
    created = models.DateTimeField(auto_now_add=True, verbose_name='creation date')
    modified = models.DateTimeField(auto_now=True, verbose_name='modification date')

    def __str__(self):
        return self.name

class Town(models.Model):
    town = models.CharField(verbose_name='town', max_length=50, unique=True)

    def __str__(self):
        return self.town

视图集:

class ShopViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows shops to be viewed, created or edited.
    """
    queryset = Shop.objects.all().order_by('-created')
    serializer_class = ShopSerializer
    permission_classes = [IsAuthenticatedOrReadOnly]

追溯只是

[2018-05-09 15:12:22 +0000] [8] [DEBUG] GET /api/Shops/
[2018-05-09 15:13:13 +0000] [8] [DEBUG] POST /api/Shops/

错误仅在 REST API 窗口中显示为带有错误文本的 json

标签: djangopython-3.xdjango-rest-framework

解决方案


推荐阅读