django根据用户访问的县数向用户收费

时间:2017-12-29 12:11:49

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

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

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

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

谢谢。

更新(我的模特):

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

2 个答案:

答案 0 :(得分: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,但可能不是你想要的。

答案 1 :(得分:1)

一种方法是在County模型中添加ManyToMany Subscriptions关系字段,然后您将查询已订阅的县并过滤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)