2017-08-18 42 views
2

这是我的模型,我想限制用户可以上传的照片数量只有10个。我想将它做到一个位置,以便它在面向管理员和用户的表单中工作。有人能帮助我吗?通过计数限制ForeignKey模型

class StarPhotos(models.Model): 

    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    PHOTO_CATEGORY = (
    ('HS', "Head Shot"), 
    ('WP', "Western Party Wear"), 
    ('IP', "Indian Party Wear"), 
    ('SW', "Swim Wear"), 
    ('CW', "Casual Wear"), 
    ) 
    category = models.CharField(max_length=2, choices=PHOTO_CATEGORY, default='CW') 
# This FileField should preferaby be changed to ImageField with pillow installed. 
    photos = models.FileField(max_length=200, upload_to='images/',) 

    def __str__(self): 
     return "Images for {0}".format(self.user) 
+0

您可以使用支票的功能,将检查用户有多少照片上传至今。虽然我认为可能有更好的解决方案 –

+0

我建议您根据使用情况重写'create()'和'save()'以在创建项目之前检查项目数量。 –

+0

通常save()在管理中不会被调用,因为它使用bulk_create() – Sayok88

回答

0

您可以使用检验器功能在你的模型,以检查用户是否上传了10张照片或不

def check_photo_count(self, user): 
    photo_count = self.object.filter(user=user).count() 
    return photo_count 

这似乎并没有成为最佳的解决方案,但它应该工作。 还请记住在您的意见或管理中检查这一点。您也可以从此功能返回一个布尔值,表示允许此用户上传更多照片。

如果您不想在任何地方进行检查,则可以将此相同的逻辑应用于manager

因此,您只需将此检查放入create方法中,并且如果检查失败,则只会引发错误或返回错误的值,表明该对象未创建。

+0

感谢Arpit,但是这样做我必须将代码添加到显示表单的任何位置。 @Muhammad Fahad Manzoor有没有我能看到的代码片段,这有助于我理解它是如何完成的? – chewinggumking

+0

@chewinggumking更新了答案。查看如何使用模型管理器的链接。 –

+0

谢谢你真的很快回复bhai。但我可能需要更多的手持。我之前几乎在文档中查看过那个页面,直到我去了crosseyed,并且无法理解如何使它做我想做的事情。如果你可以帮我什么都不喜欢它,或者如果你不能不知道Github或其他地方的模型,你可能会看到类似的东西,我会非常感激。 – chewinggumking

0

您可以覆盖保存和StarPhotos bulk_create方法,我不检查的代码,但它的一些这样的:

class CheckPhotoModelManager(models.Manager): 
    def bulk_create(self, objs, batch_size=None): 
     photos = StarPhotos.object.filter(user=objs[0].user).count() 
     if photos < 10: 
      super(StarPhotos, self).bulk_create(...) 

class StarPhotos(models.Model): 
    objects = CheckPhotoModelManager() 
    def save(self, *args, **kwargs): 
     photos = StarPhotos.object.filter(user=self.user).count() 
     if photos < 10: 
      super(StarPhotos, self).save(*args, **kwargs) 
+1

谢谢你,我会尽力回复你。 – chewinggumking