Как запросить неназначенные объекты ForeignKeyField в моделях - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть следующая модель, и давайте предположим, что у нас есть 5 SouceCode объектов и 2 Project объектов.

из 5 SouceCode objects я добавил 2 objects SourceCode как ForiegnKeyField to Project Model.

Теперь, как мне распечатать / запросить 3 SourceCode objects, который не использовался как ForeignKeyField for Project Model.


models.py
class SourceCode(models.Model):
    source_description = models.CharField(max_length=80,unique=True)
    source_urls = ArrayField(ArrayField(models.TextField(blank=True),),blank=True,null=True,default=list)
    source_results = JSONField(blank=True,null=True,default=dict)


class Project(models.Model):
    project_name = models.CharField(max_length=200,unique=True)
    project_sourcecode_O2M = models.ForeignKey(SourceCode,on_delete=models.SET_NULL,blank=True, null=True)

Один из возможных способов, который я знаю, таков:

project_source_code_list = []
for each_project in Project.objects.all():
    project_source_code_list.append(each_project.project_sourcecode_O2M.source_description)

for each_source_code in SourceCode.objects.all():
    source_description = each_source_project.source_description
    if source_description not in project_source_code_list:
        print("YEP Not there")

Я ищу хорошее альтернативное решение для этого.

Я бы хотел отфильтровать все неназначенные объекты SourceCode моделей и распечатать source_description этих объектов

Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Может быть, я неправильно читаю вопрос, но, похоже, все, что вам нужно, - это SourceCode объекты с пустыми обратными значениями ForeignKey, установленными для модели Project:

descriptions = SourceCode.objects.filter(
    project__isnull=True
).values_list('source_description', flat=True)

Здесь filter отсеивает любой SourceCode объект, подключенный хотя бы к одному проекту, а вызов values_list вытаскивает нужное вам поле.

0 голосов
/ 20 декабря 2018

Что вам нужно сделать, это получить идентификаторы всех SourceCode объектов, а затем вычесть из этого списка все Project объекты, которые назначены на SourceCode.Например;

# get the IDs of all SourceCode objects
source_ids = SourceCode.objects.values_list('id', flat=True)

# get the IDs of the SourceCode objects attached to a Project
linked_source_ids = Project.objects.values_list('project_sourcecode_O2M_id', flat=True)

# get the difference leaving the SourceCode IDs not linked to a Project
unassigned_ids = set(source_ids - linked_source_ids)

# get the SourceCode objects
unassigned_sourcecode = SourceCode.objects.filter(id__in=unassigned_ids)
...