一对一字段django admin中的过滤选项

Filter options in one to one field django admin

我有这2款

from django.db import models

def get_upload_path(instance, filename):
    return '{0}/{1}'.format(instance.imovel.id, filename)

# Create your models here.
class Imovel(models.Model):
    nome = models.CharField(max_length=50)
    descricao = models.CharField(max_length=800)
    area = models.IntegerField()
    quartos = models.SmallIntegerField(null=True, blank=True)
    banheiros = models.SmallIntegerField()
    disponivel_aluguel = models.BooleanField()
    disponivel_venda = models.BooleanField()
    valor_aluguel = models.DecimalField(max_digits=15, decimal_places=2)
    valor_venda = models.DecimalField(max_digits=15, decimal_places=2)
    valor_condominio = models.DecimalField(max_digits=15, decimal_places=2)
    valor_iptu = models.DecimalField(max_digits=15, decimal_places=2)
    capa = models.OneToOneField('ImagemImovel', related_name='capa', on_delete=models.DO_NOTHING, null=True, blank=True)

    def __str__(self):
        return self.nome

    class Meta:
        db_table = 'imovel'

class ImagemImovel(models.Model):
    imovel = models.ForeignKey(Imovel, related_name='imagens', on_delete=models.CASCADE)
    nomeImagem = models.CharField(max_length=20)
    imagem = models.ImageField(upload_to=get_upload_path)

    def __str__(self):
        return self.nomeImagem

    class Meta:
        db_table = 'imagemImovel'

我有房子和它的图片,还有一个名为 'capa' 的字段来说明哪一张是主要图片。 问题是当我通过 django admin 添加房子时,保存并回来选择主要的房子,它让我从其他房子中选择图像。我如何过滤它以仅显示与该特定房屋相关的图像?

我的 django 管理文件

from django.contrib import admin
from .models import ImagemImovel, Imovel

# Register your models here.
class ImagemImovelAdmin(admin.TabularInline):
    model = ImagemImovel

class ImovelAdmin(admin.ModelAdmin):
    inlines = (ImagemImovelAdmin, )

admin.site.register(Imovel, ImovelAdmin)

我更改了 ImovelAdmin class,这样我就可以使用 get_form 函数从模型中获取 ID,并将其用于查询集的过滤器中

class ImovelAdmin(admin.ModelAdmin):
        inlines = (ImagemImovelAdmin, )
        id_for_formfield = None
        def get_form(self, request, obj=None, **kwargs):
            if obj:
                self.id_for_formfield = obj.id
            return super(ImovelAdmin, self).get_form(request, obj, **kwargs)
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == "capa" and self.id_for_formfield is not None:
                kwargs["queryset"] = ImagemImovel.objects.filter(imovel=self.id_for_formfield)
            return super(ImovelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
    
    admin.site.register(Imovel, ImovelAdmin)