根据用户跟踪分析,我已经创建了一个跟踪方法,保存TrackUserRest记录并更新Restaurant.view_count。
版本1导入Restaurant模型时弹出错误,版本2保存记录并成功更新view_count数量,但我不知道这样的方法是否正确?
为了进一步加强研究,谁能给我一些例子,让我用正确的方式更新鹡鸰页面?
对不起,我的英文不好。
class RestaurantPage(Page)
.... #other attribute
view_count = models.PositiveIntegerField(default=0,
editable=False)
@property
def restaurant_page(self):
return self.get_parent().specific
def get_context(self, request, *args, **kwargs):
context = super(RestaurantPage, self).get_context(request, *args, **kwargs)
context['restaurant_page'] = self.restaurant_page
context['restaurant'] = self
self.tracking(request)
return context
def tracking(self, request):
track = TrackUserRest()
if request.user.is_authenticated:
track.user_id = request.user.id
else:
track.user_id = 0
track.restaurant_id = self.pk
track.time = timezone.now()
track.save()
self.view_count = self.view_count+1
return super(RestaurantPage, self).save()
# version 1
# dashboard.models
from accounts.models import ExtendedUser
from restaurant.models import RestaurantPage
class TrackUserRest(models.Model):
user_id = models.ForeignKey(ExtendedUser, on_delete=models.CASCADE)
restaurant_id = models.ForeignKey(RestaurantPage, on_delete=models.CASCADE)
time = models.DateTimeField(auto_now=True, auto_now_add=False)
class Meta:
ordering = ('time', )
def __str__(self):
return 'Restaurant Tracking system: usee.id({}) viewed rest.id({}) at timezone.({})'.format(self.user,
self.rest.title,
self.time)
# Error msg
# File "<path>/restaurant/models.py", line 19, in <module>
# from dashboard.models import TrackUserRest
# File "<path>/dashboard/models.py", line 3, in <module>
# from restaurant.models import RestaurantPage
# ImportError: cannot import name 'RestaurantPage' from 'restaurant.models' (<path>/restaurant/models.py)
#version 2
# dashboard.models
class TrackUserRest(models.Model):
user_id = models.PositiveIntegerField(null=True)
restaurant_id = models.PositiveIntegerField(blank=False, null=False)
time = models.DateTimeField(auto_now=True, auto_now_add=False)
class Meta:
ordering = ('time', )
def __str__(self):
return 'Restaurant Tracking system: user.id({}) viewed rest.id({}) at timezone.({})'.format(self.user,
self.rest.title,
self.time)
版本1导入失败是因为你有一个循环导入--。TrackUserRest
取决于 RestaurantPage
被定义,但 RestaurantPage
取决于 TrackUserRest
被定义,所以Python没有办法决定哪个先来。
解决这个问题最简单的方法是在定义ForeignKey时,使用一个字符串版本的模型名称,这样就不需要导入RestaurantPage了。
from accounts.models import ExtendedUser
class TrackUserRest(models.Model):
user_id = models.ForeignKey(ExtendedUser, on_delete=models.CASCADE)
restaurant_id = models.ForeignKey('restaurant.RestaurantPage', on_delete=models.CASCADE)
time = models.DateTimeField(auto_now=True, auto_now_add=False)