因此,我有一个模型AdminChoices
,它有一个ManytoMany
字段,可以从另一个模型choices
中选择选项。我想要另一个具有ManytoMany
字段的模型,他的选择只是AdminChoices
的选定选择。这是模型的当前代码。
class choices(models.Model):
choices = models.CharField(max_length=300)
def __str__(self):
return self.choices
class AdminChoices(models.Model):
choice1 = models.ManytoManyFields(choices, related_name="adminchoices_choice1_related")
choice2 = models.ManytoManyFields(choices, related_name="adminchoices_choice2_related")
etc
class UserChoices(models.Model):
choice1 = "choice that can only be chosen from selected AdminChoices choice1"
choice2 = "AdminChoices choice2"
etc
我正在开发一个用户可以在其中创建硬件配置的应用程序。此模型中的一个字段代表一个插槽,并且只能为该插槽选择一个选项。这些选择必须首先由管理员批准,以确保广告位可以接受该选择。这就是AdminChoices
模型的出现之处,管理员将可以访问全局管理配置,该配置批准一个插槽的选择,然后允许用户在其个人配置中选择一个已批准的选择。
我不确定我是否采用正确的方法,我将如何制作该模型?
答案 0 :(得分:1)
请注意,这并不是一个人想像的那么容易的任务。实现此目的的最简单方法是像这样重新构建数据库:
class Choice(models.Model):
choice = models.CharField(max_length=300)
def __str__(self):
return self.choice
class User(models.Model):
username=models.CharField(max_length=300)
class SlotChoice(models.Model):
slotname=models.CharField(max_length=300)
choice = models.ForeignKey(Choice, related_name="adminchoices_related")
def __str__(self):
return self.slotname + " " +self.choice.choice
class UserChoice(models.Model):
user = models.ForeignKey(User)
choice = models.ForeignKey(SlotChoice)
这很简单,但与您的要求略有不同。您可以通过调整SlotChoice模型的“ str ”方法来使此方法更加有用。
但是,如果您想真正按照原先的问题做更多工作,则难度会稍大一些。为了使这样的事情真正顺利进行,您将需要使用JavaScript:您的表单在加载时不知道您选择了哪个插槽,因此在更改插槽下拉列表时需要更改选择下拉列表。一种有效的方法是模块django-smart-selects。这很容易使用-对于初学者-神奇地添加了JS。然后您的模型将如下所示:
from smart_selects.db_fields import ChainedForeignKey
class Choice(models.Model):
choice = models.CharField(max_length=300)
def __str__(self):
return self.choice
class User(models.Model):
username=models.CharField(max_length=300)
class Slot(models.Model):
slotname=models.CharField(max_length=300)
class SlotChoice(models.Model):
slot=models.ForeignKey(Slot)
choices = models.ManytoManyFields(Choice, related_name="adminchoices_related")
class UserChoice(models.Model):
user = models.ForeignKey(User)
slot = models.ForeignKey(Slot)
choice = = ChainedForeignKey(
SlotChoice,
chained_field="slot",
chained_model_field="slot",
show_all=False,
auto_choose=True,
sort=True)