Help Needed - Model Design

It may be a long time, but I really need your help before I use it in my work. I have class Asset, which is base classothers classes (like Photo, Question, Video, etc.). This is mostly a Multiple Table Inheritance. I need this to get all the message or all user objects in the template. And he does what I want. But I noticed that many were against Multiple Table Inheritance, and some discouraged Multiple Table Inheritance. So, I really need your general opinions using Multiple Table Inheritance. And also, what is my option? Or is there another way to achieve to get all objects ( assets)User? Please help me decide what to do. I am using django and postresql. If I do not understand, ask me. I really will be grateful and appreciate if someone guides me through this.

Thank.

These are my models:

class Asset(models.Model):
    user = models.ForeignKey(User, related_name = "user_objects")
    likes = models.ManyToManyField(User, through="Like", related_name="Liked_user")
    comments = models.ManyToManyField(User, through="Comment", related_name="Commented_user")
    timestamp = models.DateTimeField(auto_now = True, auto_now_add= False)
    updated = models.DateTimeField(auto_now = False, auto_now_add = True)

    class Meta:
        ordering = ['-timestamp']

    def __unicode__(self):
        return self.__class__.__name__

class Like(models.Model):
    asset = models.ForeignKey(Asset)
    liked_by = models.ForeignKey(User)
    liked_time = models.DateTimeField(auto_now = True, auto_now_add = False)

    def __unicode__(self):
        return "%s likes %s" % (self.liked_by, self.asset)

class Comment(models.Model):
    asset = models.ForeignKey(Asset)
    comment_by = models.ForeignKey(User)
    liked_time = models.DateTimeField(auto_now = True, auto_now_add = False)

    def __unicode__(self):
        return "%s likes %s" % (self.comment_by, self.asset)

def get_upload_file_name(instance, filename):
    return "uploaded_files/%s_%s" %(str(time()).replace('.','_'), filename)


class Album(Asset):
    title = models.CharField(max_length=200)
    description = models.TextField()

    def __unicode__(self):
        return self.__class__.__name__


class Picture(Asset):
    description = models.TextField()
    image = models.ImageField(upload_to=get_upload_file_name)
    album = models.ForeignKey(Album, null=True, blank=True, default = None)

    def __unicode__(self):
        return self.__class__.__name__

class BackgroundImage(Picture):
    pass

class ProfilePicture(Picture):
    pass


class Tag(models.Model):
    title = models.CharField(max_length=40)
    description = models.TextField()

    def __unicode__(self):
        return self.title

class Question(Asset):
    title = models.CharField(max_length=200)
    description = models.TextField()
    tags = models.ManyToManyField(Tag)

    def __unicode__(self):
        return self.title

class Answer(Asset):
    description = models.TextField()
    question = models.ForeignKey(Question)

    def __unicode__(self):
        return self.description 
+4
source share
2 answers

, , , Django contenttypes framework . , 2 (.. Asset- > Picture- > BackgroundImage). , . Asset .

class Asset(models.Model):
    user = models.ForeignKey(User, related_name = "user_objects")
    likes = models.ManyToManyField(User, through="Like", related_name="Liked_user")
    comments = models.ManyToManyField(User, through="Comment", related_name="Commented_user")
    timestamp = models.DateTimeField(auto_now = True, auto_now_add= False)
    updated = models.DateTimeField(auto_now = False, auto_now_add = True)

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

    class Meta:
        ordering = ['-timestamp']

    def __unicode__(self):
        return self.__class__.__name__

class Like(models.Model):
    asset = models.ForeignKey(Asset)
    liked_by = models.ForeignKey(User)
    liked_time = models.DateTimeField(auto_now = True, auto_now_add = False)

    def __unicode__(self):
        return "%s likes %s" % (self.liked_by, self.asset)

class Comment(models.Model):
    asset = models.ForeignKey(Asset)
    comment_by = models.ForeignKey(User)
    liked_time = models.DateTimeField(auto_now = True, auto_now_add = False)

    def __unicode__(self):
        return "%s likes %s" % (self.comment_by, self.asset)

def get_upload_file_name(instance, filename):
    return "uploaded_files/%s_%s" %(str(time()).replace('.','_'), filename)


class AlbumAsset(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    asset = generic.GenericRelation(Asset)

    def __unicode__(self):
        return self.__class__.__name__

class PictureAssetBase(models.Model):
    description = models.TextField()
    image = models.ImageField(upload_to=get_upload_file_name)
    album = models.ForeignKey(Album, null=True, blank=True, default = None)
    asset = generic.GenericRelation(Asset)

    def __unicode__(self):
        return self.__class__.__name__

    class Meta:
        abstract = True

class PictureAsset(PictureAssetBase):
    pass

class BackgroundImageAsset(PictureAssetBase):
    pass

class ProfilePictureAsset(PictureAssetBase):
    pass


class Tag(models.Model):
    title = models.CharField(max_length=40)
    description = models.TextField()

    def __unicode__(self):
        return self.title

class QuestionAsset(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    tags = models.ManyToManyField(Tag)
    asset = generic.GenericRelation(Asset)

    def __unicode__(self):
        return self.title

class AnswerAsset(models.Model):
    description = models.TextField()
    question = models.ForeignKey(Question)
    asset = generic.GenericRelation(Asset)

    def __unicode__(self):
        return self.description 

content_object Asset. ABC PictureAssetBase ( abstract=True docs ) PictureAsset, BackgroundImageAsset ProfilePictureAsset .

Asset GenericRelation. , . .. , , , content_type Asset .

+1

, , - . , Asset OneToOneField . , Asset :

class Asset(models.Model):
    user = models.ForeignKey(User, related_name = "user_objects")
    likes = models.ManyToManyField(User, through="Like", related_name="Liked_user")
    comments = models.ManyToManyField(User, through="Comment", related_name="Commented_user")
    timestamp = models.DateTimeField(auto_now = True, auto_now_add= False)
    updated = models.DateTimeField(auto_now = False, auto_now_add = True)

    album = models.OneToOneField(Album, null=True, blank=True)
    picture = models.OneToOneField(Picture, null=True, blank=True)
    question = models.OneToOneField(Question, null=True, blank=True)
    answer = models.OneToOneField(Answer, null=True, blank=True)
    # etc...

    class Meta:
        ordering = ['-timestamp']

    def __unicode__(self):
        return self.__class__.__name__

Album, Picture, Question Answer Asset, .

, / , . , , "" . , , , , . , .

+1

Source: https://habr.com/ru/post/1529772/


All Articles