#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)