【发布时间】:2015-11-05 20:00:21
【问题描述】:
你好吗?首先对不起我的英语不好。
我在 DigitalOcean 中的服务器有问题。我让服务器在 Django 中使用 postgres 运行,在本地我使用 SQLite。
在这两种情况下,我都使用 Python 3.4 - 在本地窗口中,在 DO Ubuntu 中使用 python 3.4.3 和 python 3.4.0
过滤查询时遇到问题。
这是模型
# Create your models here.
class WorkOrder(models.Model):
fk_client = models.ForeignKey(Client, verbose_name='Cliente')
fk_store = models.ForeignKey(Store, verbose_name='Local')
store_internal_order = models.CharField(verbose_name='Orden Interna',
max_length=10,
null=True,
blank=True)
sector = models.IntegerField(verbose_name='Sector',
choices=SECTOR_CHOICES,
default=1)
article = models.CharField(verbose_name='Dispositivo', max_length=20)
serial = models.CharField(verbose_name='Serial', max_length=25)
work = models.CharField(verbose_name='Trabajo', max_length=40)
article_details = models.CharField(verbose_name='Detalles Artículo',
max_length=255, blank=True)
cash_advance = models.DecimalField(verbose_name='Seña', max_digits=6,
decimal_places=2,
default=0)
initial_price = models.DecimalField(verbose_name='Precio', max_digits=6,
decimal_places=2,
default=0)
service_cost = models.DecimalField(verbose_name='Costo', max_digits=6,
decimal_places=2,
default=0)
randpassw = models.CharField(default='12345', max_length=5, blank=True,
null=True)
warranty = models.PositiveSmallIntegerField(verbose_name='Garantía',
default=0,
blank=True,
null=True)
last_status = models.IntegerField(verbose_name='Estado',
choices=STATUS_CHOICES,
default=1)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
def __str__(self):
return str(self.id)
这是风景
def index(request):
if not request.user.is_authenticated():
return redirect('auth_login')
title = "Lista de Ordenes"
# Creamos el query para tomar las ordenes
queryset = WorkOrder.objects.all()
queryset = queryset.exclude(last_status=20)
# Tomamos el filtro de sector
sector_filter = request.GET.get('sector')
# Tomamos filtro de ENTREGADAS
# delivered = reqeust.GET.get('delivered')
context = {
'title': title,
}
if not request.user.is_staff:
user_store = request.user.userprofile.fk_store
# Añadimos otro filtro al queryset para tomar solo las del local
# correspondiente al usuario
queryset = queryset.filter(fk_store=user_store)
store = Store.objects.get(name=user_store)
context.update({'store': store})
# Si hay un filtro de sector volvemos a filtrar el queryset
if sector_filter:
queryset = queryset.filter(sector=sector_filter)
context.update({'queryset': queryset})
paginator = Paginator(queryset, 7) # Show 5 orders per page
page = request.GET.get('page')
try:
orders = paginator.page(page)
except PageNotAnInteger:
# If the page is not an integer, deliver first page
orders = paginator.page(1)
except EmptyPage:
orders = paginator.page(paginator.num_pages)
context.update({'orders': orders})
return render(request, "workorders/index.html", context)
这是我的问题,我必须过滤所有在最后状态中具有状态“20”(int)的工作订单
在本地工作完美!我可以看到除了最后状态为 20 的订单之外的所有订单。但是在 DigitalOcean VPS 中生产,gunicorn 正在运行。该查询仅显示最后状态为 1 的订单,并过滤所有其他订单。
我首先尝试使用此查询集queryset = WorkOrder.objects.filter(~Q(last_status=20)),然后更改为您在我看来可以看到的查询集。两者在本地都可以正常工作,但在生产环境中却不行。
编辑:添加我在生产中拥有的 queryset.query
这是生产环境中控制台中 queryset.query 的打印结果
Python 3.4.0 (default, Jun 19 2015, 14:20:21)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from work_order.models import WorkOrder
>>> queryset = WorkOrder.objects.all()
>>> queryset = queryset.exclude(last_status=20)
>>> print(queryset.query)
SELECT "work_order_workorder"."id", "work_order_workorder"."fk_client_id", "work_order_workorder"."fk_store_id", "work_order_workorder"."store_internal_order", "work_order_workorder"."sector", "work_order_workorder"."article", "work_order_workorder"."serial", "work_order_workorder"."work", "work_order_workorder"."article_details", "work_order_workorder"."cash_advance", "work_order_workorder"."initial_price", "work_order_workorder"."service_cost", "work_order_workorder"."randpassw", "work_order_workorder"."warranty", "work_order_workorder"."last_status", "work_order_workorder"."timestamp" FROM "work_order_workorder" WHERE NOT ("work_order_workorder"."last_status" = 20)
>>> queryset
[<WorkOrder: 3>, <WorkOrder: 4>, <WorkOrder: 5>, <WorkOrder: 7>, <WorkOrder: 8>, <WorkOrder: 9>, <WorkOrder: 11>, <WorkOrder: 12>, <WorkOrder: 13>, <WorkOrder: 14>, <WorkOrder: 15>, <WorkOrder: 16>, <WorkOrder: 17>, <WorkOrder: 18>, <WorkOrder: 19>, <WorkOrder: 20>, <WorkOrder: 21>, <WorkOrder: 42>, <WorkOrder: 43>, <WorkOrder: 23>, '...(remaining elements truncated)...']
>>>
编辑 2:工作正常
代码是正确的,但是当我将最后一个状态更新到列表末尾时,postgre 正在移动订单。我解决了在查询集中添加order_by('id') 的问题。
非常感谢您的帮助!
【问题讨论】:
-
问一个明显的问题:您的数据库中是否存在 last_status 不是 1 的项目?
-
是的,实际上查询仅在生产中显示 last_status 1 的项目,并且正在过滤 2、3、......、20。
标签: python django postgresql sqlite django-queryset