Django: Как добавить класс модели внутри класса или ссылаться? - PullRequest
1 голос
/ 29 марта 2020

У меня есть класс под названием Artist, который представляет профиль для художника

class Artist_object(models.Model):
    surname = models.CharField(max_length=120)
    name = models.CharField(max_length=120)
    Biography = models.TextField(default='Bitte Biography eingfügen', null=False)

Теперь я хочу, чтобы у этого художника было несколько картин с описанием.

class Artist_painting(models.Model):
    painting1 = models.ImageField()
    painting1_desc = models.CharField(max_length=120, default=None)
    painting2 = models.ImageField()
    painting2_desc = models.CharField(max_length=120, default=None)

Как можно Я поместил класс Artist_painting внутри Artist_object, чтобы для каждого художника, которого я просматриваю (у меня есть
def get_absolute_url(self): return f'/artist/{self.id}'), у него есть описание для каждого изображения?

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Это отношение ManyToOne, Множество Painting с для каждого отношения Artist, ManyToOne называется ForiegnKey, поскольку сам Artist является ключом к Painting, Каждый Painting имеет только один Artist.

class Artist(models.Model): 
    """
    no need to call it Artist_object, Stick with pep8 (ArtistObject)
    or better yet, Artist only because it's an object anyways.
    """
    surname = models.CharField(max_length=120)
    name = models.CharField(max_length=120)
    Biography = models.TextField(default='Bitte Biography eingfügen', null=False)

class Painting(models.Model):
   """
    Same naming rules apply
   """
   artist = models.ForiegnKey(Artist, on_delete=models.CASCASE, related_name="paintings")
  • Какое имя связано?

    artist - это переменная класса, вызывающая переменную artist из Painting экземпляр - это использование painting_instance.artist, что если мы хотим получить Painting s, ассоциированные с художником, это с помощью artist_instance.related_name и в этом случае это artist_instance.paintings, если вы не указали related_name, по умолчанию это будет painting_qs, если вы не хотите иметь доступ к reverse relation, я имею в виду .paintings, используйте related_name="+"

  • Что CASCASE?

    Это базовая фраза c SQL, которая означает, что при удалении Artist удаляются и его Painting.

см. этот ответ , чтобы получить более подробную информацию о ForiegnKey

1 голос
/ 29 марта 2020

Вы ссылаетесь на модель с ForeignKey [Django -doc] :

class Artist(models.Model):
    surname = models.CharField(max_length=120)
    name = models.CharField(max_length=120)
    biography = models.TextField(default='Bitte Biography eingfügen')

class Painting(models.Model):
    painting = models.ImageField()
    description = models.CharField(max_length=120, null=True, default=None)
    <b>artist = models.ForeignKey(</b>
        'Artist',
        related_name='paintings',
        on_delete=models.CASCADE
    <b>)</b>

Вы можете получить доступ к Painting объектам Artist с some_artist.paintings.all().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...