4

Django で壁を作成しようとしていますが、重要な設計上の決定に達しました。

私は次のクラスを持っています:

WallPost、UserProfile、グループ、イベント

問題は、投稿できるウォールを持つすべてのユーザー プロファイル、イベント、およびグループがあることです。したがって、投稿できるモデルが複数あるため、投稿されているモデルに投稿したユーザーから外部キー関係を作成することはできません(汎用キーを使用しない限り、すべてのウォールポストにエンクロージャーが必要だと思います)壁のオブジェクトのように)。

次に、ウォールポストが ForeignKey を送信し、次にユーザー グループとイベントがウォールに ForeignKey を送信する壁のような中間タイプのオブジェクトを用意することを考えました。壁には保存するものがなく、単に囲いのオブジェクトにすぎないため、これも私には非効率的です。

djangoでForeignKeysとManyToManyFieldsとGenericForeignKeysを使用するときのベストプラクティスは何ですか? 関係がどちらの方向に進むべきかをどのように伝えますか?

すべての入力に感謝します。

4

1 に答える 1

2
class WallPost(models.Model):
    text = models.TextField()

class UserProfile(models.Model):
    name = models.CharField(max_length=128)
    wall_posts = models.ManyToManyField(WallPost, through='UserWall')

class UserWall(models.Model):
    profile = models.ForeignKey(UserProfile)
    post = models.ForeignKey(WallPost)

#same for groups
class Group(models.Model):
    name = models.CharField(max_length=128)
    wall_posts = models.ManyToManyField(WallPost, through='GroupWall')

class GroupWall(models.Model):
    group = models.ForeignKey(Group)
    post = models.ForeignKey(WallPost)

UserWall.objects.filter(profile_id=profile.id).select_related('post')
GroupWall.objects.filter(group_id=group.id).select_related('post')

#or
group = Group.objects.get(id=1).select_related('wall_posts')
posts = group.wall_posts.all()

また

class Wall(models.Model):
    TYPE = (
        (0, 'User'),
        (1, 'Group'),
        (2, 'Event'),
    )

    source = IntegerField() #id of user/group/event
    source_type = SmallIntegerField(choices=TYPE)


class WallPost(models.Model):
    text = models.TextField()
    wall = models.ForeignKey(Wall)

そうすればよかったのに。

于 2012-08-07T17:43:33.067 に答える