Estoy aprendiendo django e intento crear una aplicación simple de preguntas y respuestas donde a los usuarios también les pueden gustar las preguntas y / o respuestas. Ahora lo que quiero hacer es rastrear a quién le gustó una pregunta / respuesta particular, así que creé un modelo separado para rastrear esto de la siguiente manera:

class Votes(models.Model):
    answer_id = models.ForeignKey(Answers, related_name='likes_answers', null=True, default=None, db_column='answer_id')
    question_id = models.ForeignKey(Questions, related_name='likes_questions', null=True, default=None, db_column='question_id')
    likes_count = models.IntegerField(blank=True, default=0)
    liked_by = models.ForeignKey(User, related_name='like_user', null=True, default=None, on_delete=models.CASCADE)

Ahora, el problema con este enfoque es que cada vez que le gusta una pregunta o una respuesta, habrá una entrada a este modelo que creará múltiples entradas del mismo question_id o answer_id con diferentes usuarios. Aunque los usuarios son diferentes, se repiten muchos answer_ids y question_ids ... ¿Es ese el enfoque correcto o puedo mejorarlo?

0
Rajat Bhardwaj 5 mar. 2017 a las 11:59

2 respuestas

La mejor respuesta

Supongo que un mejor enfoque sería utilizar campos de muchos a muchos: a los usuarios les pueden gustar múltiples preguntas / respuestas, y las preguntas / respuestas pueden ser del agrado de múltiples usuarios.

Suponiendo que su respuesta tiene una clave externa para una pregunta en particular, los modelos pueden verse así:

class Question(models.Model):
    # .. other attributes
    liked_by = models.ManyToManyField(User, related_name = 'liked_question')

class Answer(models.Model):
    question = models.ForeignKey(Question)
    # .. other attributes
    liked_by = models.ManyToManyField(User, related_name = 'liked_answer')

Para obtener todos los usuarios a los que les gustó la respuesta, use

 answer_object.liked_by.all()

Para el recuento de me gusta (de uso frecuente), simplemente usaría

answer_object.liked_by.count()

Los campos de muchos a muchos también funcionan al revés, por lo que para determinar los `` me gusta '' de un usuario, puede usarlos (gracias al nombre relacionado)

user_object.liked_question_set.all()

user_object.liked_answer_set.all()
1
L Green 5 mar. 2017 a las 12:28

No es una pregunta de Python, django, se ajusta a una pregunta de diseño RDBMS.

Pero para responder tu pregunta,

Si desea verificar el duplicado de la votación por usuario, entonces es el enfoque correcto.

Otro enfoque es actualizar la identificación del puesto de votación a la tabla de usuarios. Por supuesto, es un mal enfoque.

-1
sayingu 5 mar. 2017 a las 09:39