Django-已从另一个模型中选择的模型选择

时间:2019-02-26 15:58:24

标签: python django django-models django-admin

因此,我有一个模型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模型的出现之处,管理员将可以访问全局管理配置,该配置批准一个插槽的选择,然后允许用户在其个人配置中选择一个已批准的选择。

我不确定我是否采用正确的方法,我将如何制作该模型?

1 个答案:

答案 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)