多模型类Django的可重用视图方法

多模型类Django的可重用视图方法,django,django-models,django-views,django-urls,Django,Django Models,Django Views,Django Urls,伙计们,我想创建一个工具清单应用程序 我有这个方法,可以在所有工具类型上做完全相同的事情。我想知道的是如何使用这个方法动态地选择要使用的模型(可能是如何将模型类作为参数传递) 它目前只适用于一种工具。Mymodels.py有一个抽象模型,该模型具有所有刀具的所有公共字段,然后各种模型继承了刀具特定字段的公共字段(即端铣刀、钻头、钳子、螺丝刀等,所有这些都继承了我的抽象模型的公共字段) 这两个类继承自项 class Cortadores(Item): tipo = models.Forei

伙计们,我想创建一个工具清单应用程序

我有这个方法,可以在所有工具类型上做完全相同的事情。我想知道的是如何使用这个方法动态地选择要使用的模型(可能是如何将模型类作为参数传递)

它目前只适用于一种工具。Mymodels.py有一个抽象模型,该模型具有所有刀具的所有公共字段,然后各种模型继承了刀具特定字段的公共字段(即端铣刀、钻头、钳子、螺丝刀等,所有这些都继承了我的抽象模型的公共字段)

这两个类继承自

class Cortadores(Item):
    tipo = models.ForeignKey(Tipos_Cortadores,on_delete=models.CASCADE)
    material = models.ForeignKey(Materiales, on_delete=models.CASCADE)
    filos = models.CharField(max_length=5, choices=GABILANES)
    diametro = models.ForeignKey(Diametros, on_delete=models.CASCADE)
    longitud = models.ForeignKey(Longitud, on_delete=models.CASCADE)
    desbaste = models.CharField(max_length=1, choices=DESBASTE)

    class Meta:
        verbose_name_plural = "Cortadores"

    def get_absolute_url(self):
        return reverse('inventario:cortadores-list', kwargs={'id': self.tipo.id})

    def __str__(self):
        return '%s %s %s %s %s %s' % (  str(self.tipo), str(self.material), str(self.filos), str(self.diametro), 
                                        self.longitud, self.desbaste
                                        )


class Tornillos(Item):
    tipo =  models.CharField(max_length=10, choices=TIPO_TORNILLO)
    paso = models.ForeignKey(Paso_Tornillo, on_delete=models.CASCADE)
    material = models.ForeignKey(Materiales, on_delete=models.CASCADE)
    longitud = models.ForeignKey(Longitud, on_delete=models.CASCADE)

    class Meta:
        verbose_name_plural = "Tornillos"


    def get_absolute_url(self):
        return reverse('inventario:lista-herramientas-mecanicas')#, kwargs={'pk': self.pk})

    def __str__(self):
        return '%s %s %s %s' % (str(self.tipo), str(self.paso), str(self.material), str(self.longitud))

我为我拥有的每一种工具类型创建了一个类。为了简单起见,我只包含了这两个类,并没有用大量代码填充文章

如果您仍然可以更改表的设计,则可以使用而不是现在使用的

这意味着您将有一个模型
(这将是一个实际的数据库表),然后是从该模型继承的其他模型(它们的数据库表将只保存新字段,而不重复任何字段)

对于该更改,您只需从
Item.Meta
中删除
abstract=True
;您不需要更改模型中的其他零件。当然,您必须删除表并再次运行迁移(这将破坏您当前的数据)

正如我所说的,如果您仍然可以显著更改数据库表,那么这只是一个选项



通过此设置,您可以直接查询
项目
模型中的公共字段。有一些微妙之处你必须小心,但请阅读我链接的文档,看看它是否解决了你的问题。

我们需要查看你的抽象模型,因为根据哪些字段是常用的,这可能很简单,也可能很复杂。谢谢@Ralf,昨天我尝试了
get\u link=resolve(request.path\u info).url\u name
这样我就可以得到链接名并在我的
calcular\u nueva\u cantidad(ce,up,get\u link)
中使用它,所以根据链接名我可以添加或删除。当我阅读解析方法时,我注意到我可以从url获得kwargs,所以我尝试在代码中使用这个变量
get\u linkwargs=resolve(request.path\u info).kwargs
print(F'==>{get\u link,get\u linkwargs}并将模型作为
actualzar\u cantidad(请求、主键、模型)的参数传递
。它适用于cortadores。我如何扩展此功能?我如何简化此url以便可以多次使用?或者这是解决此问题的最佳方法?我添加了一个不同方法的答案(使用多表继承)。也许我以后会想到另一个解决方案。
class Item(models.Model):
    description = models.CharField(max_length=30,)
    numero_parte = models.CharField(max_length=30)
    proveedor = models.ForeignKey(Proveedor, on_delete=models.CASCADE)
    cantidad_existente = models.PositiveIntegerField()
    update = models.PositiveIntegerField(blank=True, default=0)
    cantidad_minima = models.PositiveIntegerField()
    precio_unitario = models.DecimalField(max_digits=7, decimal_places=2)
    total = models.DecimalField(max_digits=7, decimal_places=2, blank=True)
    asignado_a = models.ForeignKey(Empleados, on_delete=models.CASCADE, blank=True, null=True)
    anaquel = models.CharField(max_length=2, choices=ANAQUEL, blank=True, null=True)
    posicion_en_x = models.CharField(max_length=2, blank=True, null=True)
    posicion_en_y = models.CharField(max_length=2, blank=True, null=True)
    activo = models.BooleanField()

    class Meta:
        abstract = True



    def save(self,*args,**kwargs):
        self.total = self.cantidad_existente * self.precio_unitario
        super().save(*args,**kwargs)
class Cortadores(Item):
    tipo = models.ForeignKey(Tipos_Cortadores,on_delete=models.CASCADE)
    material = models.ForeignKey(Materiales, on_delete=models.CASCADE)
    filos = models.CharField(max_length=5, choices=GABILANES)
    diametro = models.ForeignKey(Diametros, on_delete=models.CASCADE)
    longitud = models.ForeignKey(Longitud, on_delete=models.CASCADE)
    desbaste = models.CharField(max_length=1, choices=DESBASTE)

    class Meta:
        verbose_name_plural = "Cortadores"

    def get_absolute_url(self):
        return reverse('inventario:cortadores-list', kwargs={'id': self.tipo.id})

    def __str__(self):
        return '%s %s %s %s %s %s' % (  str(self.tipo), str(self.material), str(self.filos), str(self.diametro), 
                                        self.longitud, self.desbaste
                                        )


class Tornillos(Item):
    tipo =  models.CharField(max_length=10, choices=TIPO_TORNILLO)
    paso = models.ForeignKey(Paso_Tornillo, on_delete=models.CASCADE)
    material = models.ForeignKey(Materiales, on_delete=models.CASCADE)
    longitud = models.ForeignKey(Longitud, on_delete=models.CASCADE)

    class Meta:
        verbose_name_plural = "Tornillos"


    def get_absolute_url(self):
        return reverse('inventario:lista-herramientas-mecanicas')#, kwargs={'pk': self.pk})

    def __str__(self):
        return '%s %s %s %s' % (str(self.tipo), str(self.paso), str(self.material), str(self.longitud))