Исключить назначенные объекты из отношения «один к одному» формы редактирования в формах администратора django

#django #django-models #django-admin

#django #django-модели #django-admin

Вопрос:

У меня есть две модели с именем RecId и Record в отношении OneToOne,

models.py

 class RecId(models.Model):
    rec_id = models.CharField(max_length=255)

    def __str__(self):
        return str(self.rec_id)


class Record(models.Model):
    rec_id = models.OneToOneField(RecId, on_delete=models.CASCADE, null=True, blank=True)
    desc = models.TextField()
    user = models.ForeignKey(UserAccount, on_delete=models.CASCADE)
    
    def __str__(self):
        return str(self.rec_id)
 

Моя проблема в том,

По умолчанию поле редактирования формы редактирования записи администратора django (поле RecId) отображает всю таблицу rec_ids in RecId . Но мне нужно показывать только записи, которые могут быть назначены записи (поскольку связь между двумя таблицами одна, один идентификатор может быть назначен только одной записи)

Я пытался сделать это с помощью formfield_for_foreignkey() метода, но в настоящее время застрял с запросом

admin.py

 @admin.register(Record)
class RecordAdmin(admin.ModelAdmin):

    list_display = ['rec_id', 'desc', 'user']
    search_fields = ['rec_id', 'user']

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "rec_id":
            kwargs["queryset"] = RecId.objects.all().exclude(... The query ...)
        return super(RecordAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 
 

Я попытался запросить его, используя ~Exists(Record.objects.filter(rec_id__eq=OuterRef('pk'))) час или два назад, и это не сработало. Поэтому любая помощь приветствуется.

Ответ №1:

Хорошо, разобрался 🙂 Запрос должен быть RecId.objects.filter(record__isnull=True) таким, чтобы admin.py будет выглядеть так,

 @admin.register(Record)
class RecordAdmin(admin.ModelAdmin):

    list_display = ['rec_id', 'desc', 'user']
    search_fields = ['rec_id', 'user']

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "rec_id":
            kwargs["queryset"] = RecId.objects.all().exclude(
                                      RecId.objects.filter(record__isnull=True)
                                      )
        return super(RecordAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)