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?
2 respuestas
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()
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.
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.