I have two classes shown below, I wanted to add a function to File to check if the file is referenced by any data inside the Project class (similar how "was published recently" is done here: https://docs.djangoproject.com/en/4.0/_images/admin12t.png ).
class File(models.Model):
def __str__(self):
return self.name
file = models.FileField(upload_to='uploads/')
class Project(models.Model):
def __str__(self):
return self.name
files = models.ManyToManyField(File)
>Solution :
class File(models.Model):
file = models.FileField(upload_to='uploads/')
def __str__(self):
return self.name
def is_used_in_a_project(self):
return self.project_set.exists()
Django automatically exposes a <model>_set attribute on the other side of a ManyToManyField relation. This is a queryset containing all of the instances that are linked to it via the m2m relation on the other model.
See https://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_many/
You can alter the name of this "reverse relation" attribute by setting the related_name of the ManyToManyField.
https://docs.djangoproject.com/en/4.0/ref/models/fields/#manytomany-arguments
e.g. you could define:
class Project(models.Model):
files = models.ManyToManyField(File, related_name="linked_projects")
class File(models.Model):
def is_used_in_a_project(self):
return self.linked_projects.exists()