Как получить список всех объектов, связанных с внешним ключом в Django
Не очень опытен с Django, поэтому прошу прощения, если это тривиально. Допустим, у меня есть экземпляр категории, и я хочу получить доступ ко всем объектам контента, которые я ранее добавил к своему внешнему ключу. Как бы я это сделал?
class Organization(models.Model):
id = models.CharField(primary_key=True, max_length=200, default=uuid4, editable=False, unique=True)
name=models.CharField(max_length=200,unique=True)
phoneNumber=models.CharField(max_length=20)
logo=models.CharField(max_length=100000) # storing this as base 64 encoded
location=models.CharField(max_length=200)
class Category(models.Model):
categoryName=models.CharField(max_length=300, unique=True, primary_key=True)
associatedOrganizations=models.ForeignKey(Organization,on_delete=models.CASCADE,related_name='associatedOrgs',null=True,blank=True)
associatedContent=models.ForeignKey(Content, on_delete=models.CASCADE,related_name='associatedContent',null=True,blank=True)
associatedMeetingNotices=models.ForeignKey(MeetingNotice,on_delete=models.CASCADE,related_name='associatedMeetingNotices',null=True,blank=True)
Например: допустим, у меня есть следующее
healthcareCategory=models.Category.objects.get(pk="healthcare")
и я хочу получить доступ ко всем организациям, связанным со здравоохранением, что мне делать?
Это?
healthcareCategory.associatedOrganizations.all()
Вы уже близко. Возможно, вы захотите изменить это связанное имя с associatedOrgs на associatedorgs, чтобы более точно следовать стилю кодирования джанго. В документации по этому поводу есть несколько примеров.
healthcare_category = Category.objects.get(pk="healthcare")
organizations = healthcare_category.associatedorgs.all()
Ответ @AMG является правильным. Если бы вы не определили related_name для associatedOrganizations, вы могли бы просто сделать
organizations = Organization.objects.filter(category__pk='healthcare')
Но я думаю, что есть еще один вопрос. Правильно ли я понимаю, что организация может иметь только одну категорию, а категория может иметь много организаций?
Если да, то я думаю, что ForeignKey в вашей модели находится в неправильном месте.
class Organization(models.Model):
id = models.CharField(primary_key=True, max_length=200, default=uuid4, editable=False, unique=True)
name=models.CharField(max_length=200,unique=True)
phoneNumber=models.CharField(max_length=20)
logo=models.CharField(max_length=100000) # storing this as base 64 encoded
location=models.CharField(max_length=200)
# The ForeignKey should be here:
category = ForeignKey(Category, on_delete=models.CASCADE)
class Category(models.Model):
categoryName=models.CharField(max_length=300, unique=True, primary_key=True)
# remove this
# associatedOrganizations=models.ForeignKey(Organization,on_delete=models.CASCADE,related_name='associatedOrgs',null=True,blank=True)
...
ForeignKey является ManyToOneField, поэтому вы помещаете его в модель, которая будет множеством, и связываете его с моделью, которая будет одним.
Теперь вы можете найти все организации в категории "Здравоохранение" следующим образом:
organizations = Organization.objects.filter(category='healthcare')