和Remark模型类似的,也是使用ContentType的方法,这样任何其他模型都可以轻松关联附件了。
class Attachment(BaseModel):
file = models.FileField('文件',blank=True)
name = models.CharField('文件名字', max_length=128,blank=False,default='')
fullpath = models.CharField('路径', max_length=256,blank=False,default='')
md5 = models.CharField('MD5', max_length=128,blank=False,default='')
description = models.CharField('附件说明', max_length=128,blank=False,default='')
creater = models.ForeignKey(
User, on_delete=models.SET_NULL, blank=True, null=True,
verbose_name='创建者', related_name='attachments_created')
updater = models.ForeignKey(
User, on_delete=models.SET_NULL, blank=True, null=True,
verbose_name='更新者', related_name='attachments_updated')
type = models.ForeignKey(
AttachmentType, on_delete=models.SET_NULL, blank=True, null=True,
verbose_name='附件类型', related_name='attachment_type')
content_type = models.ForeignKey(ContentType, blank=True,null = True,on_delete=models.CASCADE)
object_id = models.PositiveIntegerField(blank=True,null = True)
content_object = GenericForeignKey('content_type', 'object_id')
在CommonModel中增加get_attachments 函数,类对象就可以获取所有相关的附件信息。
def get_attachments(self):
try:
attachment = Attachment.objects.filter( Q(content_type = self.get_contentType(), object_id = self.id) )
return attachment
except Exception as err:
ccom_log_error(err)
return Attachment.objects.none()