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