Python Django-创建模型的子模型
我想创建子模型我不知道这是否是使用模型的正确术语。例如,假设我有一个名为Post的模型。但我希望这个模型的字段可以由用户更改。喜欢的用户选择他们的帖子类型。现在我想创建两种不同的类型:第一种是 类TextBasedPostmodels。模型: 标题=型号。CharFieldmax_长度=100 内容=从ckeditor.fields导入的RichTextField author=models.ForeignKeyUser,on_delete=models.CASCADE datePosted=models.DateTimeFielddDefault=timezone.now 定义自身: 返回自己的标题 def get_absolute_urlself: 返回反向'post_detail',kwargs={'pk':self.pk} 另一个是仅带有图像附件的帖子: 类ImageBasedPostmodels。模型: 标题=型号。CharFieldmax_长度=100 image\u attachment=models.ImageFielddefault='default.png',上传到='profile\u pics'将不会使用default.png author=models.ForeignKeyUser,on_delete=models.CASCADE datePosted=models.DateTimeFielddDefault=timezone.now def crop_图像自身: img=Image.openself.Image.path从PIL导入的图像 如果img.高度>600或img.宽度>600: 输出尺寸=600600 img.thumbnailoutput\u大小 img.saveself.image\u attachment.path 定义自身: 返回自己的标题 def get_absolute_urlself: 返回反向'post_detail',kwargs={'pk':self.pk}Python Django-创建模型的子模型,python,django,django-models,Python,Django,Django Models,我想创建子模型我不知道这是否是使用模型的正确术语。例如,假设我有一个名为Post的模型。但我希望这个模型的字段可以由用户更改。喜欢的用户选择他们的帖子类型。现在我想创建两种不同的类型:第一种是 类TextBasedPostmodels。模型: 标题=型号。CharFieldmax_长度=100 内容=从ckeditor.fields导入的RichTextField author=models.ForeignKeyUser,on_delete=models.CASCADE datePosted=m
但是,正如您所看到的,这不是一个好的使用方法,因为两种模型中都有相同的字段和相同的函数,只有一个字段和一个函数是不同的。但这不是一个好的做法。那么有没有更好的方法来实现这一点呢?最好的方法是创建一个抽象的父模型,并将所有共享字段放在其中。然后从中继承模型,并向其中任何一个添加所需的字段。然后,您将能够覆盖子模型中的方法:
class GenericPost(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(User, on_delete=models.CASCADE)
datePosted = models.DateTimeField(default=timezone.now)
class Meta:
abstract = True
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post_detail',kwargs={'pk':self.pk})
class TextBasedPost(GenericPost):
content = RichTextField() # which has been imported from ckeditor.fields
class ImageBasedPost(GenericPost):
image_attachment = models.ImageField(default='default.png', upload_to='profile_pics') # there will not be a usage of default.png
def crop_image(self):
img = Image.open(self.image.path) # Image imported from PIL
if img.height > 600 or img.width > 600:
output_size = (600,600)
img.thumbnail(output_size)
img.save(self.image_attachment.path)
在此处了解更多信息: