Django库存应用程序工具购物车更新视图

时间:2018-07-25 18:49:27

标签: django django-models django-views

我正在制作一个清单应用程序,以控制车间中工具的存在。除了知道我有多少东西外,我还想知道东西在哪里(工具在哪个工具车中)以及谁拥有工具车(员工)。我还需要记录所有损坏的工具。我一直通过以下方式进行此操作:

1.-我有一个名为 Item 的模型,该模型具有所有工具的所有通用文件,然后为每种工具类型创建一个新模型,并为每种工具类型都指定了字段,即( end -铣刀,钻头,螺钉等)。这些工具类型模型都从 Item 继承为多表继承。

2.-我为工具车及其称为 Carritos (西班牙语)的模型制作了此表,该表具有与 Employees的一对一关系(因为carrito只能由一个人拥有)。它还通过名为 Transaccion 的辅助模型与我的 Item 表建立了多对多关系,该模型处理了 Carrito 项目

这是Carritos模型

class Carritos(models.Model):
    no_carrito = models.CharField(max_length=3, unique=True)
    empleado = models.OneToOneField(Empleados, on_delete=models.CASCADE)
    # empleado = models.ManyToManyField(Empleados,  through='Transaccion')
    items = models.ManyToManyField(Item, through='Transaccion', related_name='carritos')
    f_creacion = models.DateTimeField(auto_now_add=True)
    f_actualizacion = models.DateTimeField(auto_now=True)
    activo = models.BooleanField(default=True)

    def get_absolute_url(self):
        return reverse('inventario:carrito')#, kwargs={'pk': self.pk})


    class Meta:
        verbose_name_plural = "Carritos"

    def __str__(self):
        return self.no_carrito



class Transaccion(models.Model):

    carrito = models.ForeignKey(Carritos, on_delete=models.CASCADE, related_name='items_carrito')
    herramienta = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='items_carrito')
    cantidad = models.PositiveSmallIntegerField(default=1)
    activo = models.BooleanField(default=True)
    tipo = models.CharField(max_length=10, choices=CONSUMIBLE, blank=True, null=True)
    motivo = models.CharField(max_length=10, blank=True, null=True)


    def get_absolute_url(self):
        return reverse('inventario:carrito')#, kwargs={'pk': self.pk})

3.-我必须获取 carritos 逻辑的想法是在购物车主页中获取现有购物车的列表,并将按钮绑定到CreateView CBV 根据需要创建新的carrito。

此列表还将有一个绑定到UpdateView CBV的按钮,以便在员工辞职时可以更改员工,而另一个按钮绑定到一个在理论上可以用作DetailView的功能,以查看分配的所有数据像carrito(分配给它的雇员,carrito号以及carrito中的所有项目)。

我的意图是能够在此视图中添加一个项目并列出所有项目,我设法能够添加项目,还设法显示所有项目以及carrito拥有的这些项目的数量。当需要将多个相同种类的项目添加到carrito时,我遇到了一些问题(假设我需要添加两个完全相同的刀具)。但是我认为,既然我都准备好了 Transaccion 表,并且该表将Item与Carritos绑定在一起。我可以使用它来将每个项目记录为每个项目中的1个,并具有一个布尔值活动字段,这样我就可以显示和汇总所有不同的项目以及视图中每个项目的总和。它用于显示数量。

我目前遇到的问题是,如果我要编辑工具类型并停用事务处理模型中的某个项目,则无论选择哪种过滤方式,我总是会在列表中找到第一个项目。 / p>

我对创作carritos的看法

# =========================================================================== #
#   LOGICA PARA CREAR CARRITOS
# =========================================================================== #
# ===================> Logica relacinado con Cortadores <=====================#

def home_carrito(request):
    template_name = 'inventario/carrito/createcarrito.html'
    model  = Carritos

    carritos = Carritos.objects.all()
    if carritos:
        return render(request, template_name, {'carritos':carritos})
    else:
        return render(request,template_name)


class CarritoCreate(CreateView):
    model = Carritos
    fields = [
        'no_carrito',
        'empleado',
        'activo',
    ]

class ItemCreate(CreateView):
    model = Transaccion
    fields = [
        'carrito',
        'herramienta',
    ]


def detalle_carrito(request, pk):
    model = Carritos, Transaccion
    template_name = 'inventario/carrito/detalles_carrito.html'

    carritos = Carritos.objects.filter(pk=pk)
    # GEST ALL TOOLS ASSIGNE TO CARRITO'S PK THAT ARE ACTIVE 
    # TRY TO GET ALL ACTIVE ITEMS THAT BELONG TO CARRITO = PK AND AGREGATE TOTAL ITEMS PER TYPE
    cantidades = Transaccion.objects.values('herramienta__description').annotate(Sum('cantidad')).filter(activo=True, carrito_id=pk)

    # GEST ALL TOOLS ASSIGNE TO CARRITO'S PK THAT ARE NOT ACTIVE 
    eliminados = Transaccion.objects.filter(activo=False,carrito_id=pk)

    return render(request,template_name, {'carrito':carritos, 'trans':cantidades, 'eliminados':eliminados})



class CarritoUpdate(UpdateView):
    model = Carritos
    fields = [
        'no_carrito',
        'empleado',
        'activo',
    ]
    template_name_suffix = '_update_form' 


def ItemUpdate(UpdateView):
    model = Transaccion
    fields = [
        'carrito',
        'herramienta',
        'cantidad',
        'tipo',
        'motivo',
        'activo',
    ]
    template_name_suffix = '_update_form' 





def detalle_Items(request, pk):
    model = Transaccion
    template_name = 'inventario/carrito/test-template.html'
    try:
        items_update = Transaccion.objects.filter(activo=True, carrito_id=pk, herramienta_id=pk)
    except Transaccion.DoesNotExist:
        raise Http404()

    return render(request, template_name, {'items_update':items_update})

那么我首先需要知道我在做什么是否合乎逻辑?或说得通。我需要的第二件事是知道是否有更好的方法以及如何做? 最后,我需要帮助解决我的问题:我需要进入我的 Transaccion 模型中每个商品的updateview,并能够禁用或启用该记录。

1 个答案:

答案 0 :(得分:0)

不同的人会采取不同的方法。到目前为止,我认为您构建的内容绝对可以,但是变得复杂的是构建实时库存,这看起来就像是从事务日志中构建的一样。我认为该模型缺少的是可用实时库存的快照。因为我们所谈论的并不是一个经常更改的数据模型(例如广告展示次数),所以您可以将其存储在交易副中,并根据需要对其进行计算。

例如,您的全球铁锤库存为5个铁锤。一名员工在购物车上放了一把锤子。在这里,您阐述了几个不同的用例。一是您需要知道员工XYZ(这意味着基于1对1的特定购物车)具有该特定锤子。您还想知道多少个锤子可用?您可能还想了解特定资产的营业额。员工XYZ维护购物车中的物品的时间是否比普通员工长?

要做到这一点,我认为您需要谈论协调该逻辑的API层,以及添加另一个对快照进行实际快照的对象,而不是从事务日志中进行计算。我之所以提出API层的原因是,在其中安排协调多个模型更改的逻辑可能比让模型本身容纳该逻辑更简洁。

因此,简而言之,我认为您构建的内容是可行的-但您已阐明的用例的逻辑表达式是在API的viewset / modelviewset层处理的。因为那就是您需要准备将数据加载为特定格式以进行可视化的地方。那就是那些易于序列化的地方成为模型复杂性的主导力量。