0

私はArticleテーブルを持っています

class Article(models.Model):
    """
    Model to keep articles
    """

    ext_id = models.UUIDField(primary_key=True, db_index=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=255, unique=True, db_index=True)
    content = models.TextField()
    summary = models.TextField()
    img_url = models.URLField(max_length=200)
    author = models.CharField(max_length=50, blank=True, null=True)
    sport  = models.ForeignKey('Sport')
    posted_on= models.DateTimeField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return "%s by %s" % (self.title, self.author)

ユーザーが気に入った記事を保存するテーブル:

class LikedArticle(models.Model):

    """
    Articles that a user wants to read 
    """

    ext_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    article = models.ForeignKey(Article)
    profile = models.ForeignKey(Profile)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

そして嫌い:

class UnlikedLikedArticle(models.Model):

    """
    Articles that a user does not want to read 
    """

    ext_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    article = models.ForeignKey(Article)
    profile = models.ForeignKey(Profile)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

ここでは、好きなテーブルと嫌いなテーブルの両方が構造的に同じです。is_liked保存しているデータを正確に知っているので、呼び出されたboolフィールドを保存するのではなく、このように保存する方が良いと思います。そのため、興味があるのは のみであることがわかっている場合は、膨大な数の記事を照会する必要はありませんLikedArticle。これは正しいアプローチですか?構造的には同じように見え、このデザインについて何かが正しくないので、私は混乱しているだけです.

4

3 に答える 3

1

プロファイルごとに他の情報を保存したい場合、is_liked は適切なオプションではないと思います。たとえば、誰が、いつ、何を気に入ったかなどです。これらの情報を失いたい場合は、多対多の関係を使用することをお勧めします。記事モデルは次のようになります。

class Article(models.Model):
   """
    Model to keep articles
   """

    ext_id = models.UUIDField(primary_key=True, db_index=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=255, unique=True, db_index=True)
    content = models.TextField()
    summary = models.TextField()
    img_url = models.URLField(max_length=200)
    author = models.CharField(max_length=50, blank=True, null=True)
    sport  = models.ForeignKey('Sport')
    posted_on= models.DateTimeField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    likes = models.ManyToManyField(Profile)
    unlikes = models.ManyToManyField(Profile)

def __unicode__(self):
    return "%s by %s" % (self.title, self.author)

https://docs.djangoproject.com/en/1.8/topics/db/examples/many_to_many/

私の返信の冒頭に記載されている情報を保存したい場合は、@Eyalの回答で問題ないと思います

于 2016-01-27T14:24:43.443 に答える
1

私がお勧めする最善の方法は、1 つのテーブルを使用してis_likedフィールドを追加することです。(そして、このフィールドにインデックスを追加すると、高性能のクエリが得られます)

それでも 2 つのテーブルでアプローチを使用したい場合は、設計を修正する必要があります。

すべてのフィールドを含む 1 つの抽象モデルを使用し、Like テーブルと Like テーブルは抽象モデルから継承します。

class ActionOnArticle(Model):

    your fields here.. 

    class Meta:
        abstract = True

class LikedArticle(ActionOnArticle):


class UnLikedArticle(ActionOnArticle):
于 2016-01-27T14:05:13.180 に答える