Django - 一对一模型管理
Django - one-to-one modelAdmin
我比较精通 django 并尝试将模型表单用于内部网项目。
基本上,我有一个 "Resources" 模型,由另一个团队填充。
第二个模型是 "Intake",用户提交资源请求。它与资源具有一对一映射。
Objective 每次摄入只允许分配 1 个资源。
现在,Intake 模型表单显示了表单,其中有一个指向资源的下拉字段,但需要注意的是它会显示所有资源,无论之前是否分配过资源。
例如。如果资源被摄入量占用,保存按钮会检测到不允许保存。这是预料之中的,但下拉列表不应首先显示该资源。
我该怎么做,即不显示已分配的资源?
class Resource(models.Model):
label = models.CharField(max_length=50, primary_key=True)
created = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey('auth.User', default=1)
class Meta:
verbose_name_plural = "Resource Pool"
def __str__(self):
return self.label
class Intake(models.Model):
order_id = models.AutoField(primary_key=True)
requestor = models.ForeignKey('auth.User', default=1)
resource = models.OneToOneField(Resource, verbose_name="Allocation")
project = models.CharField(max_length=50)
class Meta:
verbose_name_plural = "Environment Request"
def __str__(self):
print("self called")
return self.project
您可以在字段定义上使用 limit_choices_to
:
resource = models.OneToOneField(Resource, verbose_name="Allocation",
limit_choices_to={'intake__isnull': True})
您可以在管理员中创建自定义表单并更改 resource
字段的查询集值。像这样:
admin.py
from django import forms
from django.db.models import Q
from .models import Intake
class IntakeForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(IntakeForm, self).__init__(*args, **kwargs)
self.fields['resource'].queryset = Resource.objects.filter(
Q(intake__isnull=True) | Q(intake=self.instance)
)
class IntakeAdmin(admin.ModelAdmin):
form = IntakeForm
admin.site.register(Intake, IntakeAdmin)
我比较精通 django 并尝试将模型表单用于内部网项目。
基本上,我有一个 "Resources" 模型,由另一个团队填充。 第二个模型是 "Intake",用户提交资源请求。它与资源具有一对一映射。
Objective 每次摄入只允许分配 1 个资源。
现在,Intake 模型表单显示了表单,其中有一个指向资源的下拉字段,但需要注意的是它会显示所有资源,无论之前是否分配过资源。
例如。如果资源被摄入量占用,保存按钮会检测到不允许保存。这是预料之中的,但下拉列表不应首先显示该资源。
我该怎么做,即不显示已分配的资源?
class Resource(models.Model):
label = models.CharField(max_length=50, primary_key=True)
created = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey('auth.User', default=1)
class Meta:
verbose_name_plural = "Resource Pool"
def __str__(self):
return self.label
class Intake(models.Model):
order_id = models.AutoField(primary_key=True)
requestor = models.ForeignKey('auth.User', default=1)
resource = models.OneToOneField(Resource, verbose_name="Allocation")
project = models.CharField(max_length=50)
class Meta:
verbose_name_plural = "Environment Request"
def __str__(self):
print("self called")
return self.project
您可以在字段定义上使用 limit_choices_to
:
resource = models.OneToOneField(Resource, verbose_name="Allocation",
limit_choices_to={'intake__isnull': True})
您可以在管理员中创建自定义表单并更改 resource
字段的查询集值。像这样:
admin.py
from django import forms
from django.db.models import Q
from .models import Intake
class IntakeForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(IntakeForm, self).__init__(*args, **kwargs)
self.fields['resource'].queryset = Resource.objects.filter(
Q(intake__isnull=True) | Q(intake=self.instance)
)
class IntakeAdmin(admin.ModelAdmin):
form = IntakeForm
admin.site.register(Intake, IntakeAdmin)