从django管理表单中的编辑表单一对一关系中排除分配的对象

Exclude assigned objects from edit form one to one relationship in django admin forms

我有两个模型,名为 RecIdRecord,一对一关系,

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 admin 记录编辑表单编辑字段(RecId字段)显示RecIdtable中的所有rec_ids。但是我只需要显示可以分配给一条Record的记录(因为两个table之间的关系是OneToOne,一个id只能分配给一个记录)

我尝试使用 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'))) 查询它,但没有成功。所以非常感谢任何帮助。

好的,明白了:) 查询应该是 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)