【发布时间】:2017-05-25 12:13:12
【问题描述】:
我有以下型号:
Basket 和 Fruit
一个Basket 可以有多个Fruit 对象,一个Fruit 属于一个Basket。每个Fruit 都可以手动排序,以便在列出它们时显示它们的保存顺序。到目前为止,一切都很好。
class Basket (models.Model):
# A fruit basket
name = models.CharField(max_length=100)
is_virtual = models.BooleanField(default=False)
# This is just a badly constructed example of how a list
# of basket primary keys are saved when creating the virtual basket
# This is only for demonstration purposes to solve the overall modelling issue
virtual_baskets = models.TextField(null=True)
class Fruit (models.Model):
# The basket this fruit belongs to
basket = models.ForeignKey("Basket", related_name="fruits", on_delete=models.CASCADE)
# Manually sorted order
order = models.PositiveIntegerField(default=0)
但是,Basket 上有一个名为 is_virtual 的标志,它允许用户从现有的真实篮子中创建虚拟组合篮子,您最终会稍微违反规则:虚拟篮子实际上可以组合两个现有的Baskets,因此来自两个篮子的Fruits。我需要能够允许用户手动对这些篮子中的Fruits 进行排序和重新排序,而不会覆盖其原始篮子中的排序。
举个例子:
Basket A 依次包含:苹果、香蕉
Basket B 依次包含:橙子、葡萄
我现在希望创建一个虚拟的Basket C 来显示 A 和 B 的果实,如下所示:
苹果、葡萄、香蕉、橙子
需要注意的是:虚拟篮子只是简单地组合了来自其他各种篮子的结果。对于用户来说,它仍然是一个有效的篮子,他们应该能够重新订购水果。
如何建模这种排序关系?我正在考虑添加一个新模型:
class FruitAppearance (models.Model):
# The basket this appearance is tied to
basket = models.ForeignKey("Basket", related_name="manually_sorted_fruits", on_delete=models.CASCADE)
# The fruit it represents
fruit = models.ForeignKey("Fruit", on_delete=models.CASCADE)
# Order
order = models.PositiveIntegerField(default=0)
我想对了吗?有没有更好的办法?我应该在现有的 Fruit 和 Basket 模型之一中使用 ManyToManyField 吗?
【问题讨论】:
-
水果属于一个篮子,不管它是不是虚拟的?
-
正确,它只属于一个真实的篮子,但可以在虚拟篮子中以不同的方式呈现
-
当然也可以保存虚拟篮子,手动点水果应该坚持下去
-
是否可以有 virtual_basket_a -> apple , virtual_basket_b -> apple, my_basket -> apple ?
-
基本上,如果您创建一个虚拟篮子,它将始终放在已经属于真实篮子的水果上。所以真正篮子里的所有水果都会显示出来。这里唯一增加的功能是用户可以对他们创建的虚拟篮子中每个水果的显示顺序进行排序。
标签: python django django-models django-rest-framework