【问题标题】:How to have a list of Fields in django models?如何在 django 模型中有一个字段列表?
【发布时间】:2020-09-09 06:30:23
【问题描述】:

我有这样的模型:

from django.db import models

class Article (models.Model):
    author = models.ForeignKey('Users.User')
    title = models.CharField()
    text = models.TextField()

    stars = [
        models.IntegerField(), # 0 stars
        models.IntegerField(), # 1 stars
        models.IntegerField(), # 2 stars
        models.IntegerField(), # 3 stars
        models.IntegerField(), # 4 stars
        models.IntegerField(), # 5 stars
    ]

但问题是星星字段不会在 000x_initials.py 中被识别。
我该怎么办?

我想这样使用它:

if request.method == 'POST':
    post_data = request.post
    star = int(post_data['star'])
    article.stars[star] += 1
    article.save()

【问题讨论】:

标签: python python-3.x django django-models django-3.1


【解决方案1】:

如果您使用 POSTGRESQL 作为 DBMS,则可以使用 ArrayField:

from django.contrib.postgres.fields import ArrayField

在您的模型上:

stars = ArrayField(models.IntegerField(), size=6)

这将创建一个 6 长度的数组,您还可以创建多维数组。

其他方式尝试创建您的自定义字段。

【讨论】:

  • 谢谢,但本月我无法访问 POSTGRESQL。我将在下个月更改我的房东计划。我仍然需要一个适用于 MySQL 的答案。
【解决方案2】:

首先,如果您想存储星星,将其设为单个整数字段不是更好吗?用户可以根据用户选择存储 1,2,...5,甚至更好,只是5 个布尔字段。 无论如何,回答您的问题,您可以创建另一个具有该模型外键的模型,如下所示:

class Article (models.Model):
    author = models.ForeignKey('Users.User')
    title = models.CharField()
    text = models.TextField()

class Stars (models.Model):
    star = models.IntegerField() #I would recommend boolean field instead
    article = models.ForeignKey(Article, on_delete=models.CASCADE)

这样你就可以在一篇文章中获得很多星。您必须在视图中以不同的方式处理它,例如 Stars.objects.filter(article=article) 以获得特定文章的星标。

【讨论】:

  • 我不想要一长串数字。我想要一个长度为 6 且保留 6 个数字的列表。
  • 当然,Stars的实例创建时,检查具体文章相关的star数,如果count小于6才创建实例。
猜你喜欢
  • 2012-03-09
  • 2019-12-08
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 2023-02-24
  • 2016-10-10
相关资源
最近更新 更多