我正在构建一个网络应用程序,
基本上我目前有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
答案 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)