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

Django库存应用程序工具购物车更新视图,django,django-models,django-views,Django,Django Models,Django Views,我正在制作一个库存应用程序来控制车间中工具的存在。除了知道我有多少东西外,我还想知道东西在哪里(工具在哪个工具车中)以及工具车的所有者(员工)。我还需要记录所有损坏的工具。我一直在以以下方式进行: 1.-我有一个名为项目的模型,该模型具有所有刀具的所有公共字段,然后我为每个刀具类型创建一个新模型,每个刀具类型具有特定字段,即(立铣刀、钻头、螺钉等)。这些工具类型模型都作为多表继承从项继承 2.-我为我的工具车及其名为Carritos(西班牙语)制作了模型。该表与员工有一对一的关系(因为carri

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

1.-我有一个名为项目的模型,该模型具有所有刀具的所有公共字段,然后我为每个刀具类型创建一个新模型,每个刀具类型具有特定字段,即(立铣刀、钻头、螺钉等)。这些工具类型模型都作为多表继承从项继承

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

这是卡里托斯模型

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.-我获得Carrtos逻辑的想法是在carts主页中获得现有carts的列表,并在需要时将按钮绑定到CreateView CBV以创建新的Carrto

此列表还将有一个按钮绑定到UpdateView CBV,以便在员工离职时能够更改员工,另一个按钮绑定到一个函数,该函数理论上可以作为详细视图来查看分配给carrito的所有数据(分配给它的员工、carrito编号和carrito中的所有项目)

我的目的是能够在这个视图中添加一个项目并列出所有项目,我能够添加项目,并且能够显示carrito拥有的所有项目和这些项目的数量。我遇到了一些问题,当需要向carrito中添加多个相同类型的项目时,如何进行操作(假设我需要添加两个完全相同的切割器)。但我想既然我都准备好了,我就有了横渡赛道的桌子,这张桌子把物品和卡里托斯绑在了一起。我可以用它来记录每个项目,作为每个项目中的一个,并有一个活动字段作为布尔值,这样我就可以显示和聚合视图中所有不同的项目以及每个项目的总和。它用于显示数量

我目前遇到的问题是,如果我想编辑一个工具类型并停用事务模型中的一个项目,无论我选择如何筛选,我总是会得到列表中的第一个项目

卡里托斯创作之我见

# =========================================================================== #
#   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})
。================================================================================================================================================================================================================================================================================================#
#卡里托斯酒店
# =========================================================================== #

#================>Logica relacinado con Cortadors不同的人会采取不同的方法。到目前为止,我认为您构建的内容绝对有效,但变得复杂的是构建实时库存,它看起来像是从事务日志构建的。我认为模型中缺少的是可用的实时库存快照。因为我们谈论的不是一个频繁变化的数据模型——比如广告印象——你可以在需要时通过计算将其存储起来

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

要做到这一点,我认为您需要讨论协调该逻辑的API层,以及添加另一个快照实际库存的对象,而不是从事务日志计算库存。我之所以提出API层,是因为将用于编排多个模型更改的逻辑放在API层中可能比让模型本身包含该逻辑更干净


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

谢谢!关于API层,你有没有什么简单易懂的资源可以推荐给我?我知道这一定是一件很好的事情,但对于初学者来说容易吗?我参加了一些初级python课程,我觉得我的商店有必要拥有这个小系统。事实上,我的商店只有6名员工,工具车中的工具几乎是固定不变的(我需要经常更新的只有易耗品,如刀具,它们容易磨损,需要更换)。有人建议我将新表中的每个项目序列化,但是对于编程和MySQL来说,这听起来很可怕,我不知道从哪里开始。所以我想出了这个方法。老实说,我在这场吞食中遇到的最困难的事情之一就是寻找一种方法去做我想做的事情!很难找到用我的母语描述我打算做什么的方法,把它翻译成英语。。pff!但是回到我的问题,你能理解为什么我总是在更新视图功能中获得第一项吗?我几乎在每个项目中都使用DRF,有很多文档记录,有很多这样的例子: