开发者

Setting up a weird model in django?

This may be difficult to explain. I'm a little new to django and the whole idea of models.

Let's say I'm making an article app, where each article has a creator, but other users can edit the article at will. I'm having a little difficult on how to create the models for this.

Firstly, I extend the user profile with the following:

class UserProfile(models.Model):
    #Required field:
    user = models.OneToOneField(User)

    #Other Fields:
    headline = models.CharField()
    industry = models.CharField()
    article= models.ForeignKey(articleModel.article)

Here is the first place I'm getting confused, do I put the foreignkey field in the user model? My reasoning for it being placed here is because each article can have many editors.

Now here is my article model:

class article(models.Model):
    #primary key is already true
    creator = models.ForeignKey(userModel.UserProfile)
    title = models.CharField()
    text = models.TextField()

Over here, I put the ForeignKey field so it would relate back to the creator, because every article has a single creator. (As a side note, I do want to make it so an article can have multiple creators, but I don't know what to do in this scenario). I'm finding it a bit odd that the UserProfile model is referen开发者_如何转开发cing the article model, and the article is referencing it back. Can someone please help me unjumble my brain?

Thank you. :)


As simple as possible

from django.db.models import *
from django.contrib.admin.models import User

# UserProfile should be provided by django-profiles
class UserProfile(User): # Subclassing user creates an automatic 1-1 called user
    headline = CharField()
    industry = CharField()

class Article(Model):
                              # ALWAYS primary key to User, not UserProfile
    creator =      ForeignKey(User, related_name='articles_created')
    contributors = ManyToManyField(User, related_name='articles_edited')
    created =      DateTime(auto_now_add=True)
    modified =     DateTimeField(auto_now=True)
    title =        CharField()
    text =         TextField()
    class Meta:
        order = ['created', 'title']

fun stuff:

creator = Article.objects.all()[:1][0].creator.getUserProfile().headline

considder using django-versions if you want to keep track of edits.

class Article(VersionedModel)

EDIT: actually subclasses user


Nothing "weird" here. This is no such a django problem than a database structure problem. You need to read about 1 to 1, 1 to n and n to n relationships between tables.

Do you really need to record all editors of an article ? An article has many editors, and a user can edit many articles, so this is a many to many relationship. Here's how do do it in django.


Perhaps another field in your article model for last editor would provide you with the information you need.

lastEditor = models.ForeignKey(userModel.UserProfile)

If you really want to keep all editors you will need to implement another model which records something like: article_id, editor and edit time (maybe even the article text if you are interested in changes). You could then query this medel based on the current article to obtain a list of all editors.

you could do the same with: article_id and creator to obtain a list of creators of an article (this would replace the article field in your UserProfile class)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜