【问题标题】:django charge users based on how many counties they want to accessdjango 根据用户想要访问的县数向用户收费
【发布时间】:2017-12-29 12:11:49
【问题描述】:

我正在构建一个网络应用程序,
基本上我目前有 3 个型号,
1- 州:代表美国所有州
2- 县:代表所有带有外键的县
3- Home:代表所有带有县外键的家

该应用程序将显示房屋,
但用户需要订阅某些县(县价格可能会有所不同)
目标是:当用户订阅某些县时,他们可以看到与这些县相关的“家”

我不确定我应该如何表示用户、订阅之间的这些关系以及如何将其连接到我拥有的县模型。
以及如何为用户创建视图以添加新县。

谢谢。

更新(我的模型):

class State(models.Model):
    state_name = models.CharField(max_length=50)

    def __str__(self):
        return self.state_name

class County(models.Model):
    county_name = models.CharField(max_length=50)
    state = models.ForeignKey(State, on_delete=models.CASCADE)

    def __str__(self):
        return self.county_name

    class Meta:
        unique_together = ("county_name", "state")
        verbose_name_plural = 'Counties'

class Home(models.Model):
    owner_name = models.CharField(max_length=100, null=True, blank=True)
    street_address = models.CharField(max_length=100, null=True, blank=True)
    city = models.CharField(max_length=50, null=True, blank=True)

    county = models.ForeignKey(County, on_delete=models.CASCADE)

    postal_code = models.CharField(max_length=50, null=True, blank=True)
    price = models.CharField(max_length=50, null=True, blank=True)
    sqft = models.CharField(max_length=50, null=True, blank=True)
    home_type = models.CharField(max_length=100, null=True, blank=True)
    geom = models.PointField()

    added = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return '{}, {}, {}'.format(self.street_address, self.city, self.county.state.state_name)

    class Meta:
        verbose_name = 'Home'
        verbose_name_plural = 'Homes'

    @property
    def state_county(self):
        return f'{self.county.county_name}_{self.state}'

    @property
    def state(self):
        return self.county.state.state_name

【问题讨论】:

  • 你有任何代码来显示你到目前为止所做的尝试吗?
  • 对于我没有做任何事情之前的订阅。
  • 通常表明你已经尝试过一些东西是个好主意。看起来您正在要求其他人为您完成工作。不过没关系,我给你举个例子,你可以从那时起探索。
  • 很抱歉,我似乎没有尝试,但我不知道如何继续。
  • 至少让我分享一下我目前的模型。

标签: django django-models django-forms django-views


【解决方案1】:

这是一个基本的想法,你应该从这一点开始评估。

class State(models.Model)
    name = models.CharField(max_length=100)

class County(models.Model)
    state = models.ForeignKey(State)
    name = models.CharField(max_length=100)

class Home(models.Model)
    county= models.ForeignKey(County)
    name = models.CharField(max_length=100)

class Subscription(models.Model)
    county = models.ForeignKey(County)
    user = models.ForeignKey(User)

基本上,您可以按县向您的用户收费(注意一个人可以拥有多个县订阅)

另一种方法是在 MPTT 上使用层次结构来拥有 State>County>Home,但可能不是您想要的。

【讨论】:

  • 非常感谢 Walucas 你的例子真的很有帮助。 @borut 与县建立了多对多的关系,你认为这样更好吗?还是我应该坚持外键,说实话我也在考虑外键。
  • @Ibrahim 我认为 ForeignKey 更容易控制订阅,基本上每个订阅都有一个 ID。如果您添加开始/结束日期,您将控制用户订阅和取消订阅的时间。使用多对多,您将无法控制该级别。通常这是一个好主意,可以控制这些开始/结束日期。
  • 我刚刚写了关于borut的日期,你的想法和我一样。
  • 所以外键更容易,但是订阅在月中添加县时不会灵活,是吗?
  • 我刚刚阅读了 Borut 的回答,他说的是,有了一个潜艇,你就可以在潜艇上找到日期,这是一件好事。您可以在这两种模型中同时使用两种方式,您的决定需要是您的应用程序的常见场景。如果按一个按钮,用户可以在一个订阅中拥有三个县,然后选择 Borut's。但是,如果用户会选择一个,然后是另一个,然后是另一个,中间有一些时间间隔,那么请考虑我的。还要记住,如果你想做一些“优惠”,比如 3 个县的组合,Borut 可能更容易处理,因为你可以将它链接到组合。
【解决方案2】:

一种方法是在Subscriptions 模型中添加ManyToMany County 关系字段,然后查询订阅的县并过滤Home

某种意义上的东西:

class County(models.Model):

    county = models.CharField(max_length=255)

class Home(models.Model):

    county = models.ForeignKey(County, on_delete=models.PROTECT)

class Subscription(models.Model):

    user = models.ForeingKey(User, on_delete=models.PROTECT)
    county = models.ManyToMany(County)

然后您将查询订阅并基于此进行过滤。

subscriptions = Subscription.objects.filter(user=request.user).values_list('county', flat=True)
homes = Home.objects.filter(county_id__in=subscriptions)

您可以在订阅上使用models Manager 进一步改进这一点,以避免每次都使用类似以下内容过滤user

class SubscriptionManager(models.Manager):
    def user_subscriptions(self, user):
        return super().get_queryset().filter(user=user)

class Subscription(models.Model):

    user = models.ForeingKey(User, on_delete=models.PROTECT)
    county = models.ManyToMany(County)

    objects = SubscriptionManager()

然后过滤:

subscriptions = Subscription.objects.filter(user=request.user).values_list('county', flat=True)

subscriptions = Subscription.objects.user_subscriptions(request.user).values_list('county', flat=True)

【讨论】:

  • 感谢您提供详细的示例,但您为什么认为我们应该为县使用多对多关系?
  • 因为用户将通过一个订阅订阅多个县,而使用外键他们将无法订阅多个县,而只能订阅一个。
  • 我认为我们应该添加订阅的开始和结束日期,这样每个县都可以单独收费,是吗?
  • 这并不真正影响外键和多对多之间的决定。多对多不会从外键中获取任何内容,但增加了在一个订阅中拥有多个县的可能性。从 1 月到 5 月,您仍然可以订阅三个县,从 2 月到 5 月,您仍然可以只订阅一个县。想象一下管理用户对具有相同开始和结束日期的 47 个县的订阅。订阅表中只有 1 行,而 47 行。
  • 有意义,谢谢,所以为了管理订阅,我应该运行一个日常进程来检查订阅是否结束然后禁用它,或者我应该简单地做一个查询集来过滤订阅县的结束日期比今天大吗?
猜你喜欢
  • 2020-11-08
  • 2018-07-06
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
相关资源
最近更新 更多