django manytomanyfield .add() method

后端 未结 2 1793
难免孤独
难免孤独 2021-01-05 12:57

Suppose i have :

class Album(models.Model):
    photos = models.ManyToManyField(\'myapp.Photo\')
    photo_count = models.IntegerField(default = 0)

class P         


        
相关标签:
2条回答
  • 2021-01-05 13:22

    You can use django's signals and write a signal handler that will increment the counter using the m2m_changed signal:

    https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed

    0 讨论(0)
  • 2021-01-05 13:25

    Probably the simplest option is to skip signals, drop the photo_count field entirely and call [album].photos.count() anywhere you would have used [album].photo_count.

    You could also define a property on Album as follows:

    class Album(models.Model):
        photos = models.ManyToManyField('myapp.Photo')
    
        @property
        def photo_count(self):
            return self.photos.count()
    
    class Photo(models.Model):
        photo = models.ImageField(upload_to = 'blahblah')
    

    The downside of both options is they makes it harder to search / sort based on the number of photos. They also don't store the count in the database. (That might be import if you have some non-Django application which is interacting with the same DB.) If you think you'll want to do those sorts of searches via Django, look into Django annotations.

    This is simpler than dealing with signals, but probably still overkill.

    0 讨论(0)
提交回复
热议问题