返回相关(1:M)Django对象,其中有许多作为列表

时间:2017-09-15 20:46:10

标签: django django-models

我是Django的新手,我正在建立一个文档可见性/状态应用程序。每个文档称为"缩进",有一些"属性",这些属性有多个"状态"。

在应用程序的仪表板上,我需要动态地将属性呈现为列,将状态作为选项放在下拉列表中。

我认为我需要按照以下方式返回字典 - 但如果你有更好的建议,请告诉我。

{ 1 : ['status1','status2', 'status3'], 2 : ['status1','status2', 'status3'], ... }

其中数字是属性ID。

以下是我的模特:

class Indent(models.Model):
    dateCreated = models.DateTimeField(auto_now=True)
    indentNumber = models.CharField(max_length=75)
    creator = models.ForeignKey(settings.AUTH_USER_MODEL)

    def __str__(self):
        return '%s' % (self.indentNumber)

    class Meta:
        verbose_name = 'Indents'
        verbose_name_plural = "Indents"

class Files(models.Model):
    fileLink = models.FileField(upload_to='indents/', null=True) #Add 'indents/userID'
    indent = models.ForeignKey(Indent, on_delete=models.CASCADE)

    def __str__(self):
        return '%s' % (self.indent)

    class Meta:
        verbose_name = 'Files'
        verbose_name_plural = "Files"

"""
TO-DO

REMOVE NULL CONSTRAINT

"""
class Attribute(models.Model):
    name = models.CharField(max_length=75)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True)

    def __str__(self):
        return '%s' % (self.name)

    class Meta:
        verbose_name = 'Attributes'
        verbose_name_plural = "Attributes"

"""
TO-DO

For the names of Status objects, it needs to be more descriptive and accurate

"""
class Status(models.Model):
    name = models.CharField(max_length=255)
    attribute = models.ForeignKey(Attribute, on_delete=models.CASCADE)

    def __str__(self):
        return '%s' % (self.name)

    class Meta:
        verbose_name = 'Status'
        verbose_name_plural = "Status"


class IndentAttribute(models.Model):
    indent_id = models.ForeignKey(Indent, on_delete=models.CASCADE)
    attribute_id = models.ForeignKey(Attribute, on_delete=models.CASCADE)
    status_id = models.ForeignKey(Status, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return '%s - %s' % (self.indent_id, self.attribute_id)

    class Meta:
        verbose_name = 'Indent_Attribute'
        verbose_name_plural = "Indent_Attribute"

以下是我们正在构建的信息中心示例:

Dashboard Example

1 个答案:

答案 0 :(得分:0)

看看Django的QuerySet values_list()。以下是一个修改过的示例,用于演示其工作原理:

>>> Status.objects.values_list('name', flat=True)
<QuerySet ['Okay', 'Not Okay', 'Uh-oh', ...]>

你应该能够用它来帮助很快地构建那个词。