【问题标题】:Django field with multiple values and multiple owners具有多个值和多个所有者的 Django 字段
【发布时间】:2015-09-04 23:41:24
【问题描述】:

我正在与一个非常紧密的关系的概念作斗争。我想要类似的东西:

class Category(models.Model):
    name = models.CharField(max_length=128, unique=True)
    descriptions = models.Listfield? #or something like this

class Descriptions(models.Model):
    name = models.CharField(max_length=128, unique=True)
    categories = models.Listfield? #or something like this

这个想法是类别将具有您可以单击的描述,这将为您提供具有该描述的类别列表,反之亦然。因此,如果类别像 [Elephant, Truck, Tree] 而描述像 [Heavy, Trunk],我希望它设置为 Elephant.descriptions = [Heavy, Trunk] 和 Heavy.categories = [Elephant, Truck]

【问题讨论】:

    标签: python django list data-structures models


    【解决方案1】:

    您可以使用ManyToManyField,因为它是多对多关系(一个类别可以与多个描述相关联,一个描述可以与多个类别相关联

    class Category(models.Model):
        name = models.CharField(max_length=128, unique=True)
    
    
    class Description(models.Model):
        name = models.CharField(max_length=128, unique=True)
        categories = models.ManyToManyField(Category, blank=True)
    

    使用此方法,您只需在其中一个模型(描述或类别)中添加ManyToManyField

    然后您可以执行以下操作:

    new_cat = Category(name = 'cat1')
    new_cat.save()
    new_desc = Description(name = 'desc1')
    new_desc.save()
    new_desc.categories.add(new_cat)
    

    它们会相互关联,在Category 模型中不需要ManyToManyField

    然后您可以通过以下方式访问与new_desc 关联的所有类别:

    new_desc.categories.all()
    

    new_cat.description_set.all()
    

    所有与 new_cat 相关的描述。

    它会返回一个 QuerySet,而不是一个列表

    更多信息ManyToManyField:

    https://docs.djangoproject.com/en/1.8/topics/db/examples/many_to_many/

    【讨论】:

    • 您会建议我同时使用类别模型还是仅使用描述模型?
    • @Rob 如果您已经尝试过代码,我忘了保存这些东西,您必须保存它。我现在修好了
    • @Rob 如果有效,请接受我的回答。如果没有,请告诉我一些原因,我会尽力为您提供进一步的帮助
    • @Rob 当我实例化描述和类别时,我假设您将根据您的示例在其中有一个名为nameCharField。如果不这样做,只需从实例化部分中删除 name = 'desc1'name = 'cat1'。如果你这样做,也许你需要进行迁移和迁移?不确定。
    猜你喜欢
    • 2017-11-06
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 2019-04-23
    • 1970-01-01
    • 2017-04-08
    • 2011-08-10
    相关资源
    最近更新 更多