我有以下型號:Django的模型關係最好的解決辦法
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)
然而,有一個名爲is_virtual
在Basket
一個標誌,它允許用戶創建虛擬聯合體筐從現有的,真正的籃子,在你最終打破規則稍微的:一個虛擬的籃子實際上可合併兩個現有的Baskets
,因此來自兩個籃子的Fruit
。我需要能夠讓用戶手動對這些籃子中的Fruit
進行排序和重新排序,而不會覆蓋原始籃子中的排序。
舉個例子:
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嗎?
水果屬於一個籃子,不管它是否虛擬? –
正確,它只屬於一個真正的籃子,但可以用不同的方式在虛擬籃子中呈現 – strangetimes
虛擬籃子當然可以保存,手動水果排序也應該持續 – strangetimes