2015-03-17 2 views
4

Я делаю комментарии на моей веб-странице и хочу, чтобы пользователи могли повышать или понижать комментарий.Авто-модель с внешним ключом при создании модели - Django

Мои модели как таковые:

class Comment(models.Model): 
    owner = models.ForeignKey(User) 
    body = models.TextField(null=True, blank=True, max_length=500) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 


class Vote(models.Model): 
    comment = models.ForeignKey(Comment) 
    upvote = models.SmallIntegerField(null=True, blank=True, default=0) 
    downvote = models.SmallIntegerField(null=True, blank=True, default=0) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

Когда пользователь вводит сообщения комментарий, я хочу, чтобы также создать модель Vote, которая связана с этим комментарием.

Я новичок в django и программировании, но, исходя из моего понимания, мне нужно создать резервный крючок или что-то подобное?

+0

Это вы что искали? http://stackoverflow.com/questions/3953206/django-foreign-key-save – Charlie

+0

Из любопытства вам нужно реализовать это как много-к-одному (особенно если есть несколько вещей, на которые вы можете проголосовать, это не будет быть многоразовым)? Я всегда видел, что голосование было реализовано просто как одно поле, подобное этому http://django-vote.readthedocs.org/en/latest/getting_started.html – Charlie

ответ

4

Вы можете переопределить save() метод Comment модели, а именно:

class Comment(models.Model): 
    ... 
    def save(self, **kwargs): 
     super(Comment, self).save(**kwargs) 
     vote = Vote(comment=self) 
     vote.save() 

Я предлагаю вам прочитать documentation для лучшего понимания.

+0

Это именно то, что мне нужно. большое спасибо – snamstorm

1

Рассмотрим этот код:

class ModelA(models.Model): 
    name = models.CharField(max_length=30) 

    @classmethod 
    def get_new(cls): 
     return cls.objects.create().id 



class ModelB(models.Model): 
    thing = models.OneToOneField(ModelA, primary_key=True, default=ModelA.get_new) 
    num_widgets = IntegerField(default=0) 

Конечно, вы можете использовать лямбда-а, до тех пор, как вы вернуть целочисленное идентификатор соответствующего объекта. Я не рекомендую перезаписывать метод сохранения.