Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-创建模型的子模型_Python_Django_Django Models - Fatal编程技术网

Python Django-创建模型的子模型

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

我想创建子模型我不知道这是否是使用模型的正确术语。例如,假设我有一个名为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}
但是,正如您所看到的,这不是一个好的使用方法,因为两种模型中都有相同的字段和相同的函数,只有一个字段和一个函数是不同的。但这不是一个好的做法。那么有没有更好的方法来实现这一点呢?

最好的方法是创建一个抽象的父模型,并将所有共享字段放在其中。然后从中继承模型,并向其中任何一个添加所需的字段。然后,您将能够覆盖子模型中的方法:

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)

在此处了解更多信息: