Django模型主键作为一对

时间:2017-02-01 05:34:40

标签: django django-models

我正在尝试创建一个用户登录其个人资料的应用,并可以将歌曲添加到自己喜欢的列表中。我正在为此定义一个M2M关系。

我的问题是如何说(歌曲,歌手)的组合是独一无二的? 我搜索并发现可能通过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.

谢谢,

2 个答案:

答案 0 :(得分:3)

我会使用默认主键(自动字段),并使用元类属性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"),)

它将作为一个代理人#34;主键列。

答案 1 :(得分:1)

您没有在模特歌曲中指定ID。我还建议使用django的slug字段并在同一个上指定unique。以防你有两个同名歌手。那么第二个或更多你放的像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