2013-11-15 4 views
0

Мне нужно создать пользовательский поток. Я использую Content Type Framework в Django 1.5, и я использую сторонние пакеты «Phileo» (по вкусу), Django-Posts (for Post), Dialogos (комментарии)Создание потока операций в Django

У меня есть сообщение, комментарий, Соединение вместе с моделями баз данных событий

Вот что мое сообщение Модель выглядеть

class Post(models.Model): 
     text = models.TextField(_("Text")) 
     .... # no GenericForeignKey 

Вот мои Комментарии модели

class Comment(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.IntegerField() 
    content_object = GenericForeignKey() 

    comment = models.TextField() 

Вот мой UserEvent Модель

class UserEvent(models.Model): 
    event = models.ForeignKey(Event) 
    data_type = models.ForeignKey(ContentType, null=True) 
    data_id = models.PositiveIntegerField(null=True) 
    data_object = generic.GenericForeignKey('data_type', 'data_id') 


class Event(models.Model): 
    eventId = models.CharField(max_length=100) 
    title = models.CharField(max_length=200, default="untitled") 

UserEvent содержит всю активность пользователя, как (LoggedIn, loggedOut, SignUp, Создать сообщение, комментарий на сообщение, Как сообщение и т.д.).

Q - 1 * Что будет лучшим способом создания потока активности из него. *

Если я сделать что-то вроде feeds = UserEvents.object.all() и в шаблоне я могу сделать ..

{% for item in feeds%} 
    {% if item.data_type.name == 'post' %} 
     {{ item.data_object.text }} 
     <!-- Show post --> 
    {% endif %} 
    {% if item.data_type.name == 'connection' %} 
     <!-- Show User 3 and User 5 are now friend --> 
    {% endif %} 
{% endfor %} 

Но проблема Post не имеет внешний ключ к Comments модели.

Q - 2 Так как я могу показать комментарии, связанные с сообщением. Я действительно не хочу использовать 'Шаблонные метки'. Другое обходное решение заключается в том, что я положил comments = generic.GenericRelation(Comment) в Post Model, но я хочу быть общим (и я считаю, что UserEvent имеет все связанные элементы), потому что в будущем у меня есть еще несколько моделей. Например, «Share», «Tag», «Likes» и т. Д. .. THEN мне нужно положить все родовые отношения в мой POST.

class Like(models.Model): 

    sender = models.ForeignKey(AUTH_USER_MODEL, related_name="liking") 

    receiver_content_type = models.ForeignKey(ContentType) 
    receiver_object_id = models.PositiveIntegerField() 
    receiver = generic.GenericForeignKey(
     ct_field="receiver_content_type", 
     fk_field="receiver_object_id" 
    ) 

ответ

0

Мой подход заключается в том, чтобы делать все это в моделях. Я создаю метод в модели пользователя как:

class UserEvent(models.Model): 
    user = models.ForeignKey(User) 
    event = models.ForeignKey(Event) 
    data_type = models.ForeignKey(ContentType, null=True) 
    data_id = models.PositiveIntegerField(null=True) 
    data_object = generic.GenericForeignKey('data_type', 'data_id') 


    def record_event(self, event, obj): 

     UserEvent.objects.create(user=self, event=event, data_type=ContentType.objects.get_for_model(obj), data_id=obj.id) 

Затем в методе сохранения других моделей:

def save(self, *args, **kwargs): 

    # only record on creating a new post 
    if not self.id: 
     self.user.record_event(self.user, event=<not sure where you event from>,) 

    super(Post, self).save(*args, **kwargs) 

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

+0

ОК .. Я сохраняю UserEvent уже .. проблема в том, как получить комментарии от него и сохранить его общий. См. Мой шаблон .. UserEvent работает для меня, но я не знаю, как получить данные из it .. –

+0

UserEvent уже записывает активность пользователя (loggedIn, loggedOut, SignUp, Create Post, Comment on Post, Like Post и т. д.). Вы видите, что Post не имеет внешнего ключа для комментариев, Likes и т. Д., Так как я могу включить их во время запроса UserEvent? –

+0

Это может быть то, о чем вы говорили в Q2, но можете ли вы создать @property в Post, как def comment (self): вернуть список комментариев, связанных с этим сообщением, из общего отношения .. и сделать то же самое для статьи и т. Д.? Где-то определение того, как получить комментарии для каждого, должно быть выполнено ... – PhoebeB

0

Одна из причин создания связей между моделями в приложении django - помочь повысить эффективность поиска моделей с запросами.

Q - 1Что будет лучший способ создать поток активности из него.

Модель UserEvent аккуратно инкапсулирует это поведение вашего приложения.

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

Что-то вроде:

{% for item in feeds%} 
    {% include "display_feed.html" %} 
{% endfor %} 

display_feed.html:

{% if item.data_type.name == 'post' %} 
    {{ item.data_object.text }} 
    <!-- Show post --> 
{% endif %} 
{% if item.data_type.name == 'connection' %} 
    <!-- Show User 3 and User 5 are now friend --> 
{% endif %} 

Q-2Но проблема Сообщение не имеет внешнего ключа для комментариев модели.

Я не совсем уверен, о структуре вашего сайта, но я хотел бы предложить создание ForeignKey другого пути от Comment к Post.

Что-то вроде:

class Comment(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.IntegerField() 
    content_object = GenericForeignKey() 
    post = models.ForeignKey(Post)   

    comment = models.TextField() 

Затем это позволяет все комментарии к данной должности, чтобы извлечь, так как они related-objects:

post_comments = Post.comment_set.all() 

Если Comment объекты могут быть больше, чем просто Posts , то это можно было бы сделать общим отношением.

Все ваши будущие модели «Поделиться», «Тег», «Любит» и т. Д., Также могут иметь один и тот же внешний ключ и могут быть доступны таким же образом. Это также работает в шаблонах:

{% for item in post.comment_set.all %} 
    {% include "display_comment.html" %} 
{% end for %} 
{% for item in post.tag_set.all %} 
    {% include "display_tag.html" %} 
{% end for %} 

UserEvent ИМХО модель не относится к деятельности получения комментариев, так не должно быть использовано здесь. Это может показаться слегка упрощенным ответом, но часто в django простые ответы наиболее эффективны, быстрее всего реализуются и лучше всего;;).

+0

У меня есть другие модели, такие как статьи, галерея, изображения тоже. Я использую ContentType во всех них, чтобы сделать вещи родовыми. Подобно' content_type = 'Image' object_id = 'image_id' , content_type = 'Video' object_id = 'video_id'', поэтому добавление внешнего ключа для публикации не имеет смысла. –

+0

Я добавил 'ForeignKey' к' Comment' _not_ 'Post'. –

+0

Мне нужно добавить 'ForeignKey' в' Comment' в мои «Модели статей, галереи, видео»? –

Смежные вопросы