我正在尝试创建一个用户登录其个人资料的应用,并可以将歌曲添加到自己喜欢的列表中。我正在为此定义一个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.
谢谢,
答案 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