Django文件的扩展';比萨饼示例(按配料筛选比萨饼)

Django文件的扩展';比萨饼示例(按配料筛选比萨饼),django,database-design,django-models,data-modeling,Django,Database Design,Django Models,Data Modeling,在上一次会议上,Django团队描述了比萨饼和配料的多对多关系。我以他们为例,试图找到一个解决方案,解决我在为自己的数据建模时遇到的一个概念性问题 为了解释这个堆栈溢出的结果,我要考虑的是什么,请考虑下面的(假设的)语法: 上面的模型可以(例如)执行ToppingAmount.objects.filter(topping\uu name='foo').filter(amount\uu gt=bar),并找到所有的ToppingAmount对象,使其比萨饼上至少有一巴克的foo 不幸的是,它还允许

在上一次会议上,Django团队描述了比萨饼和配料的多对多关系。我以他们为例,试图找到一个解决方案,解决我在为自己的数据建模时遇到的一个概念性问题

为了解释这个堆栈溢出的结果,我要考虑的是什么,请考虑下面的(假设的)语法:

上面的模型可以(例如)执行
ToppingAmount.objects.filter(topping\uu name='foo').filter(amount\uu gt=bar)
,并找到所有的ToppingAmount对象,使其比萨饼上至少有一巴克的foo

不幸的是,它还允许反常的
ToppingAmount.objects.filter(pizza\uu name='pippo').filter(amount\uu gt=bar)
,它将查找所有的ToppingAmount对象,以便在其顶部至少有bar克的“pippo”

这是我用这个模型和简单的过滤器所能做到的。我们无法根据其他配料(或比萨饼)和数量筛选结果查询集,因为此查询集仅包含ToppingAmount对象。此查询集中的每个ToppingAmount对象将具有相同的topping或相同的pizza。它们的所有数量(无论解释为描述配料还是比萨饼)也将符合
过滤器(数量…

此外,我观察到使用这里的多对多关系没有任何实际好处。消除Pizza类中的toppings,同时保持其他所有内容在数据库中的结果相同,该数据库具有相同的json转储和相同的实用程序,以避免可能的查询


尝试2: 创建一个比萨饼表,其中包含所有146种可能的配料

from django.db import models
class Topping(models.Model):
  name= modles.CharField(max_length=128)
  units = models.CharField(max_length=4) # e.g. 'g' | 'kg' | 'lb' | 'oz' ...

class Pizza(models.Model):
    name = models.CharField(max_length=128)
    topping1_amount = models.FloatField()
    .
    .
    .
    topping146_amount = models.FloatField()

    # On Python 3: def __str__(self):
    def __unicode__(self):
        return self.name

我谨慎地相信这个解决方案,因为它创建了一个大而稀疏的表,我不认为这是必要的或可取的(欢迎评论)。另一方面,为这个模型编写查询非常简单:
Pizza.objects.filter(topping1\u amount\u gt=20)、filter(topping2\u amount\u lt=15).

您的尝试1比尝试2要好得多。你能举一个你正在努力解决的问题的具体例子吗?我很确定有一种方法可以实现你所期待的for@karthikr基本上,实际的查询及其各自的模型就是我在这里试图发现的。我知道,在尝试2中给出的模型和查询将为我提供我想要的查询集,但我不喜欢它涉及如此大和稀疏的表。我不确定评论是否是说这句话的惯常方式,但我想知道为什么你觉得尝试1比尝试2好。对于我所追求的查询结果类型的现场演示,任何免费的在线股票筛选程序都足够了(例如)。我只是想找出这些系统的总体框架,并决定将其放在Django docs的比萨饼和配料上下文中。有了这样一个数据筛选的一般知识,你可以添加表格或列,以便通过多种营养特性来筛选披萨。我喜欢1比2,因为,假设你在不久的将来有6种新的配料。您不想对这样一个琐碎的任务进行模型更改。很多人都可以在管理界面中添加浇头。
from django.db import models
class Topping(models.Model):
  name = models.CharField(max_length=128)

  # On Python 3: def __str__(self):
  def __unicode__(self):
    return self.name

class Pizza(models.Model):
  name = models.CharField(max_length=128)
  toppings = models.ManyToManyField(Topping, through='ToppingAmount')

  # On Python 3: def __str__(self):
  def __unicode__(self):
    return self.name

class ToppingAmount(models.Model):
  topping = models.ForeignKey(Topping)
  pizza = models.ForeignKey(Pizza)
  amount = models.FloatField()
  units = models.CharField(max_length=4) # e.g. 'g' | 'kg' | 'lb' | 'oz' ...
from django.db import models
class Topping(models.Model):
  name= modles.CharField(max_length=128)
  units = models.CharField(max_length=4) # e.g. 'g' | 'kg' | 'lb' | 'oz' ...

class Pizza(models.Model):
    name = models.CharField(max_length=128)
    topping1_amount = models.FloatField()
    .
    .
    .
    topping146_amount = models.FloatField()

    # On Python 3: def __str__(self):
    def __unicode__(self):
        return self.name