【问题标题】:How to write a model method that references another model?如何编写引用另一个模型的模型方法?
【发布时间】:2012-09-20 00:41:29
【问题描述】:

我想创建一个模型方法,它将“用户”(它是一个 CharField)用于 给定的评论,然后返回与定义为部分的该用户关联的“报价” 的用户配置文件。我正在尝试创建方法和模板。到目前为止我尝试过的事情似乎没有奏效。

我知道做到这一点的最佳方法可能是在其中创建“用户”字段 Reviewbackup a ForeignKey to user,但我想知道如何使用 方法,所以我可以学习。

models.py

class Reviewbackup(models.Model):
    review = models.CharField('Review', max_length = 2000)
    user = models.CharField('Username', max_length =  200)
    rating = models.IntegerField(max_length=2, choices=RATING_OPTIONS)
    product = models.ForeignKey(Productbackup)
    def __unicode__(self):
        return self.review

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    quote = models.CharField('About', max_length =  200, null=True, blank=True)
    website = models.URLField('Personal website/blog', null=True, blank=True)
    facebook = models.URLField('Facebook profile page', max_length = 200, null=True, blank=True)
    twitter = models.URLField('Twitter profile page', max_length = 200, null=True, blank=True)
    youtube = models.URLField('YouTube channel page', max_length = 200, null=True, blank=True)

views.py

def view_reviews(request, product_name):
    product = get_object_or_404(Productbackup, url_friendly=product_name)
    product_id = product.id
    #get reviews for the this product
    reviews = Reviewbackup.objects.filter(product_id=product_id).order_by("-created_on")
    return render_to_response('reserve/templates/view_reviews.html', {'reviews':reviews},
        context_instance=RequestContext(request))

模板

{% for review in reviews %} 
{{review.user}}
<br>{{review.user.userprofile.quote}}
{% endfor %}

【问题讨论】:

  • 您是否考虑在User 中查找它?
  • @IgnacioVazquez-Abrams 你是什么意思?

标签: django templates view methods model


【解决方案1】:

如果问题的条件是“不要对用户使用 ForeignKey,而是使用 CharField 作为用户名”,您可以将该方法添加到您的 Reviewbackup 模型中,例如:

def get_user_quote(self):
    return UserProfile.objects.get(user__username=self.user).quote

并在模板中使用它:

{{ review.get_user_quote }}

但您确实应该将您的用户字段替换为 ForeignKey

【讨论】:

  • 谢谢@Dima。我意识到将其设为 ForeignKey 会容易得多,但我正在为我的应用程序中已经有相当多的数据这一事实而苦苦挣扎。你能帮我理解使用方法与 ForeignKey 相比有什么缺点吗?
  • Reviewbackup 数据库表只存储来自 User 表的用户 ID。默认情况下,它会有一个适当的索引,这样连接表会更快。使用 ForeignKey,您可以更轻松地通过 orm 访问数据,例如:{{ review.user.userprofile.quote }}
  • 如果我尝试将 CharField 替换为 ForeignKey(User),这会对我的应用程序中已有的数据产生影响吗?我是否必须重新加载所有内容,因为用户之前引用的是字符串而不是对象?
  • 当然,您必须编写一些迁移(或在 sql 中手动执行此操作),以便用户字段指向数据库中正确的用户记录。如果你还没有,你应该考虑使用南迁移
  • 我正在使用迁移,这是我尝试执行此操作时遇到的错误:ValueError: invalid literal for int() with base 10: 'sharat' (url is localhost:8000/products/glossybox/reviews)。在模板中,错误指向:{{review.user}}
猜你喜欢
  • 2023-02-24
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 2021-05-24
相关资源
最近更新 更多