Django модель для разных моделей - PullRequest
0 голосов
/ 19 апреля 2020

Я учусь Django и пытаюсь создать приложение типа вики. В этой вики есть разные типы моделей: персонажи, предметы, заклинания и приключения. Каждая модель имеет несколько одинаковых полей (например, name, author, date_created и т. Д. c.) И некоторые поля, уникальные для модели, например, продолжительность приключений, выравнивание для персонажей и т. Д. c. У меня проблема в том, что если они разные модели, то каждый раз, когда я хочу сделать что-то общее для всех моделей (например, возможность любить, добавлять в избранное, создавать, редактировать и т. Д. c.), кодировать для каждой модели индивидуально. Есть ли способ создать своего рода модель содержимого, содержащую каждый символ, элемент, заклинание и приключение, чтобы каждый раз, когда я хочу создать форму или функцию, я просто создавал форму содержимого или функцию содержимого?

Вот часть кода, некоторые части на испанском sh, но я перевёл важные части:

    class Character(models.Model):
    ALIGNMENT= (
        ('Legal Bueno', 'Legal Bueno'),
        ('Legal Neutral', 'Legal Neutral'),
        ('Legal Malvado', 'Legal Malvado'),
        ('Neutral Bueno', 'Neutral Bueno'),
        ('Neutral', 'Neutral'),
        ('Neutral Malvado', 'Neutral Malvado'),
        ('Caótico Bueno', 'Caótico Bueno'),
        ('Caótico Neutral', 'Caótico Neutral'),
        ('Caótico Malvado', 'Caótico Malvado')
    )

    name = models.CharField(max_length=50)
    author = models.ForeignKey(Usuario, null=True, on_delete=models.CASCADE, editable=False, related_name='personajes')
    alignment = models.CharField(max_length=50, choices=ALIGNMENT)
    description= models.CharField(max_length=200, null=True)
    likes = models.ManyToManyField(Usuario, blank=True, related_name='personaje_likes')
    favorites = models.ManyToManyField(Usuario, blank=True, related_name='personaje_favoritos')


class Item(models.Model):
    name = models.CharField(max_length=50)
    author = models.ForeignKey(Usuario, null=True, on_delete=models.CASCADE, editable=False, related_name='items')
    description= models.CharField(max_length=200, null=True)
    likes = models.ManyToManyField(Usuario, blank=True, related_name='item_likes')
    favorites = models.ManyToManyField(Usuario, blank=True, related_name='item_favoritos')


class Spell(models.Model):
    name = models.CharField(max_length=50)
    author = models.ForeignKey(Usuario, null=True, on_delete=models.CASCADE, editable=False, related_name='hechizos')
    description= models.CharField(max_length=200, null=True)
    likes = models.ManyToManyField(Usuario, blank=True, related_name='hechizo_likes')
    favorites = models.ManyToManyField(Usuario, blank=True, related_name='hechizo_favoritos')


class Adventure(models.Model):
    DURATION = (
        ('Corta', 'Corta'),
        ('Mediana', 'Mediana'),
        ('Larga', 'Larga')
    )

    name = models.CharField(max_length=50)
    author = models.ForeignKey(Usuario, null=True, on_delete=models.CASCADE, editable=False, related_name='aventuras')
    duration = models.CharField(max_length=50, choices=DURATION)
    description = models.CharField(max_length=200)
    likes = models.ManyToManyField(Usuario, blank=True, related_name='aventura_likes')
    favorites = models.ManyToManyField(Usuario, blank=True, related_name='aventura_favoritos')

1 Ответ

0 голосов
/ 19 апреля 2020

Я думаю, что вы можете создать базовую модель и затем использовать OneToOneField для этой модели в других ваших моделях.

class BaseContent(models.Model):
    name = models.CharField(max_length=500)
    author= models.CharField(max_length=500)
    (...)

class Characters(models.Model):
    base_content = models.OneToOneField(BaseContent, on_delete=models.CASCADE)
    (...)
...