繁体   English   中英

创建和更新数据从 API answerI 到 Django REST 项目 (MySQ)?

[英]Creating and updating data from API answerI to Django REST project (MySQ)?

我有一个 Django REST 项目。 我有一个模型用户、商店和仓库。

我有一个带有市场解析器的模块,它从市场 API 获取数据。在这个模块中有一个 class 市场和一个方法“get_warehouses_list”。 该方法返回一个 JSON 和一个 STORE 的仓库列表。 例题答案:

{
"result": [
{
"warehouse_id": 1,
"name": "name1",
"is_rfbs": false
},
{
"warehouse_id": 2,
"name": "name2",
"is_rfbs": true
}
]
}

我必须做的是创建和更新方法来设置和更新这个仓库列表到我的 MySQL 数据库中(创建一个端点来设置和更新这个数据)。

我不知道我的代码有什么不正确,但是当我在 urls.py 中向我的端点发送 POST 请求时

router.register("", WarehouseApi, basename="warehouse")

我收到 400 错误,而不是将仓库列表设置到我的数据库中。

我的代码:

用户/模型.py

class User(AbstractUser):
    username = models.CharField(
        max_length=150,
        unique=True,
        null=True)
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        unique=True,
        editable=False)

商店/模型.py`

class Store(models.Model):
    user = models.ForeignKey(
        User,
        on_delete=models.PROTECT)
    name = models.CharField(max_length=128,
                            blank=True)
    type = models.PositiveSmallIntegerField(
        choices=MARKET,
        default=1,
        verbose_name="Type API") 
    api_key = models.CharField(max_length=128)
    client_id = models.CharField(max_length=128)

warehouses/models.py

class Warehouse(models.Model):
    store = models.ForeignKey(
        Store,
        on_delete=models.СASCAD, null=True)
    warehouse_id = models.BigIntegerField(
        unique = True,
        null = True)
    name = models.CharField(
        max_length=150)
    is_rfbs = models.BooleanField(default=False)

`序列化器.py

`

class WarehouseSerializer(serializers.ModelSerializer):

    class Meta:
        model = Warehouse
        fields = '__all__'

    store = serializers.CharField(max_length=50)
    warehouse_id = serializers.IntegerField()
    name = serializers.CharField(max_length=100)
    is_rfbs = serializers.BooleanField()
    is_default_warehouse = serializers.BooleanField()

class WarehouseUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Warehouse
        fields = ('name', 'is_rfbs',)

    def save(self, **kwargs):
        self.instance.name = self.validated_data["name"]
        self.instance.is_rfbs = self.validated_data["is_rfbs"]
        self.instance.save
        returself.instance

views.py

class WarehouseApi(ModelViewSet):

    def get_queryset(self):
        return Warehouse.objects.filter(
            store__user_id=self.request.user.pk)\
            .order_by('-warehouse_id')

    def get_serializer_class(self):
        if self.request.method in ("PUT", "PATCH"):
            return WarehouseUpdateSerializer
        return WarehouseSerializer

    def create(self, request, *args, **kwargs):
        st = Store.objects.filter(user=self.request.user,  # getting all stores with marketplace type = 1
                                  type=1)
        for e in st:
            api = Market(api_key=e.api_key,                # call parser class Market
                                client_id=e.client_id)
            data = api.get_warehouses_list()               # call Market's method 'get_warehouses_list'
        if len(data['result']) > 0:
            for wh in data['result']:
                alreadyExists = Warehouse.objects.filter(  # check if warehouses with such ID already exists
                        warehouse_id=wh.get(
                        'warehouse_id')).exists()
                if alreadyExists:
                        return Response({'message':'Warehouse ID already exists'})
                else:
                    wh_data = {
                        'warehouse_id': wh.get('warehouse_id'),
                        'name': wh.get('name'),
                        'is_rfbs': wh.get('is_rfbs')
                        }
                    Warehouse.objects.create(**wh_data)
                    warehouses = Warehouse.objects.filter(
                    marketplace=1, store__in=st).order_by(
                    '-warehouse_id')
                    s = WarehouseSerializer(warehouses, many=True)
                    return Response(status=200, data=s.data)
        else:
            return Response(status=400,
                        data={"Error": "Store has no warehouses"})

    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        api = Market(api_key=instance.store.api_key,
                            client_id=instance.store.client_id)
        warehouses = Warehouse.objects.filter(store__user_id=self.request.user,
                                            store__type=1)     # get all store's warehouses
        if warehouses:
            for warehouse in warehouses:
                r = api.get_warehouses_list()               # call Market's method 'get_warehouses_list'
                if len(r['result']) > 0:
                    for wh in r['result']:
                        if serializer.validated_data["name"] != wh['name']:
                            instance.name = wh['name']
                            instance.save(['name'])
                        if serializer.validated_data["is_rfbs"] != wh['is_rfbs']:
                            instance.name = wh['is_rfbs']
                            instance.save(['is_rfbs'])
                        serializer = WarehouseUpdateSerializer(instance)
                        return Response(serializer.data, {
                                    'status': status.HTTP_200_OK,
                                    'message': 'Warehouse updated successfully'
                                    })
                else:
                    return Response({
                                    'message': 'Store has no warehouses'
                                    })
        else:
            return Response({
                            'message': 'There are no saved warehouses in DB'
                            })

`

400 错误可能是由多种原因引起的。 您有任何可以提供的日志记录信息吗? 来自 Python 日志或使用浏览器开发人员工具?

在您自己的代码中,如果变量数据为空,您将返回 400 代码。 你确定你没有达到这个验证吗?

如果什么都没有发生,我建议您为自己的代码添加一些异常处理和日志记录功能,因为它似乎非常不受保护,并在需要时在此处发布该信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM