2016-02-13 119 views
1

我在我的路径(多对多)表中获得重复,并希望它只包含独特的项目。Django多对多避免重复

models.py

class Image(models.Model): 
    path = models.CharField(max_length=128) 

class User(models.Model): 
    username = models.CharField(max_length=32) 
    created = models.DateTimeField() 
    images = models.ManyToManyField(Image, through='ImageUser') 

class ImageUser(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    image = models.ForeignKey(Image, on_delete=models.CASCADE) 

但是,我似乎能够用相同的路径创建一个以上的图像。我想要一个独特的图像路径指向多个用户,而不会在Image表中有重复的图像。

u = User.objects.create(username='AndyApple') 
i = Image(path='img/andyapple.jpg') 
i.save() 
ui = ImageUser(user=u, image=i) 
ui.save() 

u2 = User.objects.create(username='BettyBanana') 
ui = ImageUser(user=u2, image=i) 

这似乎在图像表中为同一图像创建两行。文档建议这不应该发生ManyToManyField.through

谢谢!

回答

0

你确定你的代码添加了重复到Image而不是ImageUser(这是多少对多表工作)?

--------------------  ---------------------------  ---------------------------- 
|  Users  |  |   ImageUser  |  |   Image   | 
--------------------  ---------------------------  ---------------------------- 
| id | username |  | id | user_id | image_id |  | id |   path  | 
-------------------- --< --------------------------- >-- ---------------------------- 
| 1 | AndyApple |  | 1 | 1 |  1 |  | 1 | 'img/andyapple.jpg' | 
--------------------  ---------------------------  ---------------------------- 
| 2 | BettyBanana |  | 2 | 2 |  1 | 
--------------------  --------------------------- 

但无论如何,问题不在这里,如果你想:

“一个独特的图像路径指向多个用户,而无需在图像为表 重复的图像。”

那么你必须定义该字段为unique,请参阅下面的代码示例。在这种情况下,如果您尝试使用已经在DB中的路径保存图像,则会引发异常。但请注意,在这种情况下,如果两个用户上传不同的图像,但名称相同,则最后上传的图像将用于两个用户。

class Image(models.Model): 
    path = models.CharField(max_length=128, unique=True)