gpt4 book ai didi

python - Django 模型设计 - 多对多字段

转载 作者:太空宇宙 更新时间:2023-11-03 17:51:24 26 4
gpt4 key购买 nike

来自 PHP 背景,我知道如何“手动”完成此操作,但我似乎无法理解如何使用 Django ORM 构建数据库。

该应用程序以 list 为中心。 list 具有一些识别功能,例如 NameDateOfBirthChecklistType

有多个 ChecklistType,每个都有多个 ChecklistOptionChecklistOption 可能会也可能不会在多个 ChecklistType

我最初的想法是为 ChecklistTypeChecklistTypeOptions 创建一个模型来存储 list 的“配置”,并为 Checklist 创建一个单独的模型code> 和 Requirements(分别)链接到 Customer 模型。我想我应该手动查找配置并在创建 Customer 的 View 中创建后一个模型条目。然后我意识到这失败了 ORM!

我确信这个问题可以通过正确理解模型中使用多对多字段的方式来解决,但是 Django Documentation似乎只处理简单的应用程序。如果我在 ChecklistChecklistOption 中创建 ManyTomany 字段(使用 ChecklistType 作为 ChoiceField),我将无法指定适用的选项到那种类型。

我确信这种事情必须定期进行,但我无法理解它。

提前致谢,

说明 - 示例数据

list 选项

Cheese {boolean}
Tomato {boolean}
Bacon {boolean}
Chicken {boolean}
Coffee {boolean}
Pepperoni {boolean}
Salami {boolean}
Mushrooms {boolean}
Eggs {boolean}

list 类型

ThingsToPutOnPizza: {options: Cheese, Tomato, Bacon, Chicken, Salami, Mushrooms}
ThingsToEatAtBreakfast: {options: Cheese, Bacon, Coffee, Eggs}

客户

John Smith: {Name: "John Smith", DOB: 1984-12-17, Checklist: ThingsToEatAtBreakfast}
Jane Jones: {Name: "Jane Jones", DOB: 1987-07-22, Checklist: ThingsToPutOnPizza}
Frank Allen {Name: "Frank Allen", DOB: 1990-04-01, Checklist: ThingsToPutOnPizza}

工作流程

用户创建客户,并选择 list 类型。另一个用户必须“完成” list ,因此从列表中选择客户,并显示该 list 类型中的选项的复选框列表,并且在这些选项中,他们可以勾选一些选项,而不勾选其他选项。保存表单/模型时,将根据 list 记录其用户和时间,以将其标记为完成。

最佳答案

这可能是最简单的解决方案:

模型.py

from django.db import models

class CheckList(models.Model):
name = models.CharField(max_length=255)
checklist_type = models.ForeignKey('CheckListType')
options = models.ManyToManyField('CheckListOption', blank=True)

def __unicode__(self):
return self.name

class CheckListType(models.Model):
name = models.CharField(max_length=255)
options = models.ManyToManyField('CheckListOption')

def __unicode__(self):
return self.name

class CheckListOption(models.Model):
name = models.CharField(max_length=255)

def __unicode__(self):
return self.name

forms.py

from django import forms

from .models import CheckList, CheckListOption

class CheckListForm(forms.ModelForm):
class Meta:
model = CheckList
fields = '__all__'

def __init__(self, *args, **kwargs):
super(CheckListForm, self).__init__(*args, **kwargs)
if self.instance.pk:
self.fields['options'].queryset = CheckListOption.objects.filter(
checklisttype=self.instance.checklist_type_id
)
else:
self.fields['options'].queryset = CheckListOption.objects.none()

admin.py

from django.contrib import admin

from .forms import CheckListForm
from .models import CheckList, CheckListType, CheckListOption

class CheckListAdmin(admin.ModelAdmin):
form = CheckListForm

admin.site.register(CheckList, CheckListAdmin)
admin.site.register(CheckListType)
admin.site.register(CheckListOption)

只有一个缺点 - 当您已经保存了 CheckList 实例并且想要更改 checklist_type 时,您将不会获得新的选项就在此刻。进行更改的用户应取消选择所选选项(这是一种 optional ,但如果不这样做,所选选项将保留到下一次保存),保存模型并再次编辑以选择新选项。

关于python - Django 模型设计 - 多对多字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29036344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com