2017-02-01 2 views
1

Я пытаюсь создать приложение, в котором пользователи войдут в свой профиль и смогут добавлять песни в свой список избранного. Я определяю для этого отношение M2M.Первичный ключ модели Django в качестве пары

Мой вопрос в том, как сказать, что сочетание (песня, певица) уникально? Я искал и обнаружил, что это возможно с помощью unique_together. Это правильный способ установить это?

models.py:

from django.contrib.auth.models import User 


class Singer(models.Model): 
    name = models.CharField(max_length=500, unique=True) 

    def __str__(self): 
     return self.name 


class Song(models.Model): 
    id = models.AutoField(primary_key=False) 
    singer = models.ForeignKey(Singer, on_delete=models.CASCADE, related_name='song') 
    name = models.CharField(max_length=500) 

    Class Meta: 
     unique_together = (singer, id) 

    def __str__(self): 
     return self.name 

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    songs = models.ManyToManyField(Song, related_name='profile') 

    def __str__(self): 
     return self.user.username 

Пожалуйста, не стесняйтесь исправить мой models.py, если вы считаете, что отношения не правильно.

Спасибо,

ответ

1

Я хотел бы использовать первичный ключ по умолчанию (авто поля), а также использовать свойство меты класса, unique_together

class Song(models.Model): 
     singer = models.ForeignKey(Singer, on_delete=models.CASCADE, related_name='song') 
     name = models.CharField(max_length=500) 

     class Meta: 
      unique_together = (("singer", "name"),) 

Он будет выступать в качестве «суррогатного» столбца первичного ключа.

0

Вы не указываете id в своей модели. Я бы также рекомендовал использовать поле slug django и указать уникальный на нем. На всякий случай у вас есть два исполнителя с тем же именем. Затем второй или более вы помещаете как abc, abc-1, abc-2, и в этом случае вам не нужно менять имя, а свойство unique_together работает нормально.

class Song(models.Model): 
    singer = models.ForeignKey(Singer, on_delete=models.CASCADE, related_name='song') 
    name = models.CharField(max_length=500) 

    class Meta: 
     unique_together = (("singer", "name"),) 

    def __str__(self): 
     return self.name 
Смежные вопросы