django-restful:购物车 学习记录

Posted mengdie1978

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django-restful:购物车 学习记录相关的知识,希望对你有一定的参考价值。

购物车 就有 获取购物车详情 加入购物车 删除购物记录 同样 直接使用mixins 中的 就够了

view 这里面没有一个陌生的 基本都是前面学习过了的

class ShoppingCartViewset(viewsets.ModelViewSet):
    """
    购物车功能
    list:
        获取购物车详情
    create:
        加入购物车
    delete:
        删除购物记录
    """
    permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
    # serializer_class = ShopCartSerializer
    lookup_field = \'goods_id\'

    def get_queryset(self):
        # 获取属于用户的购物车list
        return ShoppingCart.objects.filter(user=self.request.user)

    def get_serializer_class(self):
        if self.action == \'list\':
            return ShopCartDetailSerializer
        else:
            return ShopCartSerializer

serializer

#购物车详情
class ShopCartDetailSerializer(serializers.ModelSerializer):
    goods = GoodsSerializer(many=False,read_only=True)  
    #购物车详情中 一个商品只能有一个 
    #如果用户对一个商品多次购买  就进行数量累加 
    #而下面这个 serializer 就不用  可以多样显示
    class Meta:
        model = ShoppingCart
        fields = "__all__"

#购物车
class ShopCartSerializer(serializers.Serializer):  # 为什么不使用modelserializer 可以去看model中的解释
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )
    goods = serializers.PrimaryKeyRelatedField(queryset=Goods.objects.all(), required=True)
    nums = serializers.IntegerField(label="数量", required=True, min_value=1, error_messages=
        \'min_value\': "商品数量不能小于一",
        "required": "请选择购买数量",
    )
  #这里就是重写create方法 因为 本身的serializer验证不能通过
    def create(self, validated_data):
        user = self.context[\'request\'].user  # 上下文
        nums = validated_data[\'nums\']
        goods = validated_data[\'goods\']

        existed = ShoppingCart.objects.filter(user=user, goods=goods)
        if existed:
            existed = existed[0]
            existed.nums += nums
            existed.save()
        else:
            existed = ShoppingCart.objects.create(**validated_data)  # 创建这个购物车内容

        return existed

    def update(self, instance, validated_data):
        # 修改商品数量
        # instance 是model 的实例
        instance.nums = validated_data[\'nums\']
        instance.save()
        return instance

 

JavaWeb学习记录(十三)——商城购物之添加订单的数据库级联操作

一、方法实现

private JdbcTemplate jdbcTemplate = new JdbcTemplate(DBConn.getDataSource());

    @SuppressWarnings("deprecation")
    @Override
    public boolean insertObject(Orders entity) {
        String sql1 = "insert into orders(number,status,uid) values(?,?,?)";
        // 保存订单
        int num1 = jdbcTemplate.update(sql1, new Object[] { entity.getNumber(),
                "未付款", entity.getUser().getId() });
        if (num1 > 0) {
            //获取订单id
            int id = jdbcTemplate.queryForInt(
                    "select id from orders where number=?", entity.getNumber());
            //设置订单id
            entity.setId(id);
            boolean flag = false;
            // 保存订单详情
            List<OrdersItem> ordersItems = entity.getOrdersItems();
            String sql2 = "insert into ordersItem(gid,num,price,oid)values(?,?,?,?)";
            if (ordersItems != null) {
                for (OrdersItem item : ordersItems) {
                    // 保存订单条目
                    int num2 = jdbcTemplate.update(
                            sql2,
                            new Object[] { item.getGoods().getId(),
                                    item.getNum(), item.getPrice(),
                                    item.getOrders().getId() });
                    if (num2 > 0) {

                    } else {
                        flag = true;
                        break;
                    }
                }
                if (flag) {
                    System.out.println("OrdersItem 有一个插入失败");
                } else {
                    // 查出总价格
                    String sql3 = "select sum(price) as sum from ordersItem where oid=?";
                    Double sum = jdbcTemplate.queryForObject(sql3,
                            new RowMapper<Double>() {

                                @Override
                                public Double mapRow(ResultSet rs, int arg1)
                                        throws SQLException {
                                    // TODO Auto-generated method stub
                                    return rs.getDouble("sum");
                                }
                            }, entity.getId());
                    // 更新订单总价格
                    String sql4 = "update orders set sum=? where id=?";
                    int num3 = jdbcTemplate.update(sql4, new Object[] { sum,
                            entity.getId() });
                    if (num3 > 0) {
                        System.out.println("更新成功");
                    } else {
                        System.out.println("更新失败");
                    }
                }
            } else {
                System.out.println("订单插入失败");
            }
        }

        return false;
    }
二、测试

public class OrderTest {
    private OrdersDao ordersDao=new OrdersDaoImpl();
    @Test
    public void test1(){
        Orders orders=new Orders();
        orders.setNumber("0x0014");
        User u=new User();
        u.setId(1);
        orders.setUser(u);
        
        //创建一个订单集合
        List<OrdersItem> ordersItems=new ArrayList<OrdersItem>();
        Goods goods=new Goods(1, "", 5000, null, null);
        OrdersItem item1=new OrdersItem(goods, 3, 3*goods.getPrice(), orders);
        ordersItems.add(item1);
        
        Goods goods1=new Goods(2, "", 11, null, null);
        OrdersItem item2=new OrdersItem(goods1, 3, 3*goods1.getPrice(), orders);
        ordersItems.add(item2);
        
        orders.setOrdersItems(ordersItems);
        ordersDao.insertObject(orders);
    }
}

三、事务处理的方法
    private JdbcTemplate jdbcTemplate = new JdbcTemplate(DBConn.getDataSource());

    @Override
    public boolean insertObject(final Orders entity) {
        //事务处理,保证下面的语句要么全都执行,要么全都不执行
        
        //事务管理对象
        PlatformTransactionManager transactionManager=new DataSourceTransactionManager(DBConn.getDataSource());
        //事务管理的模板对象
        TransactionTemplate template=new TransactionTemplate(transactionManager);
        //执行操作
        return template.execute(new TransactionCallback<Boolean>() {

            @Override
            public Boolean doInTransaction(TransactionStatus ts) {
                String sql1 = "insert into orders(number,status,uid) values(?,?,?)";
                // 保存订单
                int num1 = jdbcTemplate.update(sql1, new Object[] { entity.getNumber(),
                        "未付款", entity.getUser().getId() });
                if (num1 > 0) {
                    //获取订单id
                    @SuppressWarnings("deprecation")
                    int id = jdbcTemplate.queryForInt(
                            "select id from orders where number=?", entity.getNumber());
                    //设置订单id
                    entity.setId(id);
                    boolean flag = false;
                    // 保存订单详情
                    List<OrdersItem> ordersItems = entity.getOrdersItems();
                    String sql2 = "insert into ordersItem(gid,num,price,oid)values(?,?,?,?)";
                    if (ordersItems != null) {
                        for (OrdersItem item : ordersItems) {
                            // 保存订单条目
                            int num2 = jdbcTemplate.update(
                                    sql2,
                                    new Object[] { item.getGoods().getId(),
                                            item.getNum(), item.getPrice(),
                                            item.getOrders().getId() });
                            if (num2 > 0) {

                            } else {
                                flag = true;
                                break;
                            }
                        }
                        if (flag) {
                            System.out.println("OrdersItem 有一个插入失败");
                            ts.setRollbackOnly();
                            return false;
                        } else {
                            // 查出总价格
                            String sql3 = "select sum(price) as sum from ordersItem where oid=?";
                            Double sum = jdbcTemplate.queryForObject(sql3,
                                    new RowMapper<Double>() {

                                        @Override
                                        public Double mapRow(ResultSet rs, int arg1)
                                                throws SQLException {
                                            // TODO Auto-generated method stub
                                            return rs.getDouble("sum");
                                        }
                                    }, entity.getId());
                            // 更新订单总价格
                            String sql4 = "update orders set sum=? where id=?";
                            int num3 = jdbcTemplate.update(sql4, new Object[] { sum,
                                    entity.getId() });
                            if (num3 > 0) {
                                System.out.println("更新成功");
                                return true;
                            } else {
                                System.out.println("更新失败");
                                ts.setRollbackOnly();
                                return false;
                            }
                        }
                    } else{
                        return true;
                    }
                }else {
                    System.out.println("订单插入失败");
                    ts.setRollbackOnly();
                    return false;
                }

            }
        });
        
    }

以上是关于django-restful:购物车 学习记录的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb学习记录(十四)——商城购物之字符串拼接实现最近浏览商品和购物车的功能

使用 angular 向 django-rest 发送 DELETE 请求被解释为 OPTIONS

Django-Rest + React 前端:CORS 问题

markdown Fluxo django-rest

Django-rest 跨域请求失败

使用 django-rest 框架中的 GET 方法将 url 作为参数传递?