【问题标题】:best way to design scheme in django when we have diff categories and products当我们有不同的类别和产品时,在 django 中设计模式的最佳方法
【发布时间】:2020-01-01 07:14:06
【问题描述】:

我正在为一个电子商务市场网站设计 django 模型,用户可以在该网站上购买 4 种类型的产品。就像我有 4 种类型的差异模型一样。

衣服

class Merchandise(models.Model):
    adOwner = models.ForeignKey(VendorProfile, on_delete=models.CASCADE)
    imagesMerchandise = models.ManyToManyField(merchandiseImages)
    productName = models.CharField(max_length=50, null=False, blank=False)
    price = models.IntegerField()
    availableQuality=models.IntegerField()
    color=models.CharField(max_length=20, null=False, blank=False)
    size = models.CharField(max_length=50 , null=False , blank=False)
    description=models.CharField(max_length=250 , null=False , blank=False)
    is_approved = models.BooleanField(default=False)
    def __str__(self):
        return str(self.productName)

租车

class Vehicle(models.Model):
    adOwner=models.ForeignKey(VendorProfile, on_delete=models.CASCADE)
    carImages=models.ManyToManyField(Image)
    make=models.CharField(max_length=50, null=False, blank=False)
    modelName=models.CharField(max_length=50, null=False, blank=False)
    registrationNumber=models.CharField(max_length=50, null=False, blank=False)
    modelYear=models.CharField(max_length=50, null=False, blank=False)
    modelColor=models.CharField(max_length=50, null=False, blank=False)
    carType=models.CharField(max_length=50, null=False, blank=False)
    fuelMileage=models.CharField(max_length=50, null=False, blank=False)
    SeatingCapacity=models.CharField(max_length=50, null=False, blank=False)
    vehicleCondition=models.CharField(max_length=50, null=False, blank=False)
    fuelType=models.CharField(max_length=50, null=False, blank=False)
    price=models.CharField(max_length=50, null=False, blank=False)
    description=models.CharField(max_length=500, null=True, blank=True)
    registerIn=models.CharField(max_length=500, null=True, blank=True)
    is_approved = models.BooleanField(default=False)

    def __str__(self):
        return str(self.modelName)

预订酒店

class Accommodation(models.Model):
    adOwner = models.ForeignKey(VendorProfile, on_delete=models.CASCADE)
    hotleImages = models.ManyToManyField(HotleImages)
    accommodationTitle=models.CharField(max_length=150)
    location = models.CharField(max_length=150)
    accommodationName = models.CharField(max_length=150)
    checkIn = models.TimeField()
    checkOut = models.TimeField()
    # accessibility = models.CharField(max_length=20, null=False, blank=False)
    address = models.CharField(max_length=150)
    pets = models.CharField(max_length=150)
    child = models.CharField(max_length=150)
    is_approved = models.BooleanField(default=False)

创建活动

class ActivityOrganizer(models.Model):
    adOwner = models.ForeignKey(VendorProfile, on_delete=models.CASCADE)
    activityImage = models.ManyToManyField(ActivityImage)
    activityName = models.CharField(max_length=50 , null=False, blank=False)
    activityId = models.CharField(max_length=20, null=False, blank=False)
    ageSuggestion = models.CharField(max_length=20, null=True, blank=True)
    duration = models.CharField(max_length=20, null=False, blank=False)
    openTime = models.TimeField()
    closeTime=models.TimeField()
    expiryDate = models.DateField()
    availableQty = models.IntegerField()
    price = models.IntegerField()
    needToBring = models.CharField(max_length=50 , null=True , blank=True)
    personsAllowOnOneTicket = models.IntegerField()
    location = models.CharField(max_length=50 , null=True , blank=False)
    specialNotes = models.CharField(max_length=250 ,null=True , blank=True)
    description = models.CharField(max_length=250 , null=True , blank=True)
    is_approved = models.BooleanField(default=False)

现在我做了一个这样的订单表

class Orders(models.Model):
    order_number = models.AutoField(primary_key=True)
    total_amount = models.DecimalField(max_digits=10, decimal_places=2)
    ordertime = models.DateTimeField(auto_now_add=True)
    user_note=models.CharField(max_length=150 , null=True, blank=True)
    address=models.CharField(max_length=150 , null=True, blank=True)
    order_status = models.CharField(choices=STATUS , max_length=50)
    payment_status=models.BooleanField(default=0)

现在我很困惑如何将所有这 4 个类别绑定到我的订单对象。如果它是单一类别的,我可以简单地使用订单模型创建一个外键。但是我如何绑定所有这些(因为用户可以选择 1,2,3,4 个类别)所以如果用户选择住宿和车辆类别产品,我如何在外键中保存 2 个类别为空。任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    如果您的产品数量很少(在您的情况下为 4 个),并且每个订单只能订购一个类型的商品,那么您可以简单地将它们添加到 Orders 具有可空字段的模型中

    class Orders(models.Model):
        order_number = models.AutoField(primary_key=True)
        total_amount = models.DecimalField(max_digits=10, decimal_places=2)
        ordertime = models.DateTimeField(auto_now_add=True)
        user_note=models.CharField(max_length=150 , null=True, blank=True)
        address=models.CharField(max_length=150 , null=True, blank=True)
        order_status = models.CharField(choices=STATUS , max_length=50)
        payment_status=models.BooleanField(default=0)
        merchandise = models.ForeignKey(Merchandise, on_delete=models.CASCADE, null=True, blank=True)
        vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE, null=True, blank=True)
        accommodation = models.ForeignKey(Accommodation, on_delete=models.CASCADE, null=True, blank=True)
        activity_organizer = models.ForeignKey(ActivityOrganizer, on_delete=models.CASCADE, null=True, blank=True)
    

    要列出特定类别的所有订单,请排除给定字段中所有为空的订单。

    Orders.objects.exclude(merchandise__isnull=True)
    

    此外,如果仅订购了一个类别产品,则其余 3 个字段将为空,如果您想强制执行该业务逻辑,则可以通过创建信号来检查它。

    【讨论】:

    • 感谢您的回复。这些是我的类别,所以如果我必须记录针对每个类别订购的每个产品,那么我会怎么做?
    • 如果我不想'对于每个订单只能订购一种类型的物品',那么它对我不起作用?
    • 这里只处理1个案例。如果我想购买 3 个商品产品、2 个住宿产品、1 个 activity_organizer,那么我必须为所有这些类别创建单独的模型?
    • 是的,如果您想要一个订单对多个产品的关系,您必须为所有类别创建一个单独的表。
    • 你能举个小例子吗?我肯定会接受作为答案
    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2017-04-30
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2014-04-18
    相关资源
    最近更新 更多