:art: Filter left_num gt 0

huangqimin лет %!s(int64=5): %!d(string=назад)
Родитель
Сommit
e3ff618d3b
3 измененных файлов с 34 добавлено и 6 удалено
  1. 7 4
      api/member_views.py
  2. 25 0
      member/migrations/0015_auto_20191221_2058.py
  3. 2 2
      member/models.py

+ 7 - 4
api/member_views.py

@@ -31,10 +31,10 @@ def member(request):
31 31
     rights = RightInfo.objects.filter(status=True).order_by('position')
32 32
     rights = [right.data for right in rights]
33 33
 
34
-    goods = GoodsInfo.objects.filter(only_for_member=False, status=True).order_by('position')
34
+    goods = GoodsInfo.objects.filter(only_for_member=False, left_num__gt=0, status=True).order_by('position')
35 35
     goods = [good.data(user_id) for good in goods][:2]
36 36
 
37
-    member_goods = GoodsInfo.objects.filter(only_for_member=True, minlevel__lte=user.level, status=True).order_by('position')
37
+    member_goods = GoodsInfo.objects.filter(only_for_member=True, left_num__gt=0, minlevel__lte=user.level, status=True).order_by('position')
38 38
     member_goods = [good.data(user_id) for good in member_goods]
39 39
     member_goods = [good for good in member_goods if not good['has_member_exchange']]
40 40
 
@@ -106,7 +106,7 @@ def goods(request):
106 106
     except UserInfo.DoesNotExist:
107 107
         return response(UserStatusCode.USER_NOT_FOUND)
108 108
 
109
-    raw_goods = GoodsInfo.objects.filter(only_for_member=False, status=True).order_by('position')
109
+    raw_goods = GoodsInfo.objects.filter(only_for_member=False, left_num__gt=0, status=True).order_by('position')
110 110
     banners = goods = []
111 111
     for good in raw_goods:
112 112
         if good.is_slider:
@@ -173,7 +173,7 @@ def good_exchange(request):
173 173
         return response(UserStatusCode.USER_NOT_FOUND)
174 174
 
175 175
     try:
176
-        good = GoodsInfo.objects.get(good_id=good_id)
176
+        good = GoodsInfo.objects.select_for_update().get(good_id=good_id)
177 177
     except GoodsInfo.DoesNotExist:
178 178
         return response(MemberGoodStatusCode.GOOD_NOT_FOUND)
179 179
 
@@ -186,6 +186,9 @@ def good_exchange(request):
186 186
     user.integral -= good.integral
187 187
     user.save()
188 188
 
189
+    good.left_num -= 1
190
+    good.save()
191
+
189 192
     GoodsOrderInfo.objects.create(
190 193
         user_id=user_id,
191 194
         good_id=good_id,

+ 25 - 0
member/migrations/0015_auto_20191221_2058.py

@@ -0,0 +1,25 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.26 on 2019-12-21 12:58
3
+from __future__ import unicode_literals
4
+
5
+from django.db import migrations, models
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('member', '0014_auto_20191221_1613'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.AlterField(
16
+            model_name='goodsinfo',
17
+            name='left_num',
18
+            field=models.IntegerField(db_index=True, default=0, help_text='\u5546\u54c1\u5e93\u5b58', verbose_name='left_num'),
19
+        ),
20
+        migrations.AlterField(
21
+            model_name='goodsinfo',
22
+            name='minlevel',
23
+            field=models.IntegerField(db_index=True, default=0, help_text='\u5151\u6362\u6700\u4f4e\u4f1a\u5458\u7ea7\u522b', verbose_name='minlevel'),
24
+        ),
25
+    ]

+ 2 - 2
member/models.py

@@ -28,7 +28,7 @@ class GoodsInfo(BaseModelMixin):
28 28
     title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'商品名称')
29 29
     desc = RichTextField(_(u'desc'), blank=True, null=True, help_text=u'商品描述')
30 30
     value = models.IntegerField(_(u'value'), default=99999, help_text=u'商品价值,单位分')
31
-    left_num = models.IntegerField(_(u'left_num'), default=0, help_text=u'商品库存')
31
+    left_num = models.IntegerField(_(u'left_num'), default=0, help_text=u'商品库存', db_index=True)
32 32
 
33 33
     image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'商品图片')
34 34
 
@@ -40,7 +40,7 @@ class GoodsInfo(BaseModelMixin):
40 40
     integral = models.IntegerField(_(u'integral'), default=99999, help_text=u'兑换所需积分')
41 41
     fee = models.IntegerField(_(u'fee'), default=99999, help_text=u'兑换需额外支付金额,单位分')
42 42
 
43
-    minlevel = models.IntegerField(_(u'minlevel'), default=0, help_text=u'兑换最低会员级别')
43
+    minlevel = models.IntegerField(_(u'minlevel'), default=0, help_text=u'兑换最低会员级别', db_index=True)
44 44
 
45 45
     only_for_member = models.BooleanField(_(u'only_for_member'), default=False, help_text=u'会员专属', db_index=True)
46 46